technology: Fix technology refcounting
authorAlok Barsode <alok.barsode@linux.intel.com>
Wed, 22 Feb 2012 14:19:13 +0000 (16:19 +0200)
committerSamuel Ortiz <sameo@linux.intel.com>
Fri, 24 Feb 2012 22:29:49 +0000 (23:29 +0100)
__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.

src/technology.c

index 12ed5af..4a0f9f1 100644 (file)
@@ -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;