summaryrefslogtreecommitdiff
path: root/src/technology.c
diff options
context:
space:
mode:
authorAlok Barsode <alok.barsode@linux.intel.com>2012-02-22 16:19:13 +0200
committerSamuel Ortiz <sameo@linux.intel.com>2012-02-24 23:29:49 +0100
commitb4605cae51a5cb3e4a402c57aad2cd798a8c70c5 (patch)
tree730c1961748a5ca4cd13dc0a620a9a70f0bd5d7a /src/technology.c
parent19e51ec8264ce0d32ffdee28f7194a55f85ee7f2 (diff)
downloadconnman-b4605cae51a5cb3e4a402c57aad2cd798a8c70c5.tar.gz
connman-b4605cae51a5cb3e4a402c57aad2cd798a8c70c5.tar.bz2
connman-b4605cae51a5cb3e4a402c57aad2cd798a8c70c5.zip
technology: Fix technology refcounting
__sync_fetch_and_sub() gives the value that had previously been in memory which gives the older refount. technology_find() does not refcount the technology. __connman_technology_update_rfkill() was using technology_get() which was refcounting the technology. Every technology_get() must be matched with a corresponding technology_put() for accurate refcounting.
Diffstat (limited to 'src/technology.c')
-rw-r--r--src/technology.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/technology.c b/src/technology.c
index 12ed5af5..4a0f9f16 100644
--- a/src/technology.c
+++ b/src/technology.c
@@ -934,7 +934,7 @@ static void technology_put(struct connman_technology *technology)
{
DBG("technology %p", technology);
- if (__sync_fetch_and_sub(&technology->refcount, 1) > 0)
+ if (__sync_sub_and_fetch(&technology->refcount, 1) > 0)
return;
reply_scan_pending(technology, -EINTR);
@@ -1281,7 +1281,7 @@ int __connman_technology_update_rfkill(unsigned int index,
return 0;
}
- technology = technology_get(type);
+ technology = technology_find(type);
/* If there is no driver for this type, ignore it. */
if (technology == NULL)
return -ENXIO;