diff options
author | Alok Barsode <alok.barsode@linux.intel.com> | 2012-02-22 16:19:13 +0200 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2012-02-24 23:29:49 +0100 |
commit | b4605cae51a5cb3e4a402c57aad2cd798a8c70c5 (patch) | |
tree | 730c1961748a5ca4cd13dc0a620a9a70f0bd5d7a /src/technology.c | |
parent | 19e51ec8264ce0d32ffdee28f7194a55f85ee7f2 (diff) | |
download | connman-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.c | 4 |
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; |