[PATCH] technology: fix technology refcounting

Alok Barsode alokbarsode at gmail.com
Wed Feb 22 06:19:13 PST 2012


From: Alok Barsode <alok.barsode at linux.intel.com>

__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 |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/technology.c b/src/technology.c
index 12ed5af..4a0f9f1 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;
-- 
1.7.1




More information about the connman mailing list