diff options
author | Daniel Wagner <daniel.wagner@bmw-carit.de> | 2011-10-31 13:19:09 +0100 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2011-11-10 13:09:50 +0100 |
commit | 9232d39e6a0738b750e97efd04124c81b7b2e583 (patch) | |
tree | 23b4bc3d39f0c6b16a55e8bc9df760e220f2c749 /src/notifier.c | |
parent | 6bd851d905799dfb02e66eadc37c2e85b4b8f402 (diff) | |
download | connman-9232d39e6a0738b750e97efd04124c81b7b2e583.tar.gz connman-9232d39e6a0738b750e97efd04124c81b7b2e583.tar.bz2 connman-9232d39e6a0738b750e97efd04124c81b7b2e583.zip |
core: Use gcc atomics instead glib's ones
g_atomic_int_exchange_and_add() has been removed from glib 2.30
and g_atomic_int_add() should be used. Though there are still
quite a few distros out which do not ship a glib version with
g_atomic_int_add().
Instead of maintaing a compatiblilty glib layer we just use
the built-in functions for atomic memory access.
Diffstat (limited to 'src/notifier.c')
-rw-r--r-- | src/notifier.c | 57 |
1 files changed, 36 insertions, 21 deletions
diff --git a/src/notifier.c b/src/notifier.c index 332bafb1..5ba22649 100644 --- a/src/notifier.c +++ b/src/notifier.c @@ -73,21 +73,22 @@ void connman_notifier_unregister(struct connman_notifier *notifier) #define MAX_TECHNOLOGIES 10 -static volatile gint registered[MAX_TECHNOLOGIES]; -static volatile gint enabled[MAX_TECHNOLOGIES]; -static volatile gint connected[MAX_TECHNOLOGIES]; +static volatile int registered[MAX_TECHNOLOGIES]; +static volatile int enabled[MAX_TECHNOLOGIES]; +static volatile int connected[MAX_TECHNOLOGIES]; void __connman_notifier_list_registered(DBusMessageIter *iter, void *user_data) { int i; + __sync_synchronize(); for (i = 0; i < MAX_TECHNOLOGIES; i++) { const char *type = __connman_service_type2string(i); if (type == NULL) continue; - if (g_atomic_int_get(®istered[i]) > 0) + if (registered[i] > 0) dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &type); } @@ -97,13 +98,14 @@ void __connman_notifier_list_enabled(DBusMessageIter *iter, void *user_data) { int i; + __sync_synchronize(); for (i = 0; i < MAX_TECHNOLOGIES; i++) { const char *type = __connman_service_type2string(i); if (type == NULL) continue; - if (g_atomic_int_get(&enabled[i]) > 0) + if (enabled[i] > 0) dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &type); } @@ -113,13 +115,14 @@ void __connman_notifier_list_connected(DBusMessageIter *iter, void *user_data) { int i; + __sync_synchronize(); for (i = 0; i < MAX_TECHNOLOGIES; i++) { const char *type = __connman_service_type2string(i); if (type == NULL) continue; - if (g_atomic_int_get(&connected[i]) > 0) + if (connected[i] > 0) dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &type); } @@ -158,8 +161,9 @@ unsigned int __connman_notifier_count_connected(void) { unsigned int i, count = 0; + __sync_synchronize(); for (i = 0; i < MAX_TECHNOLOGIES; i++) { - if (g_atomic_int_get(&connected[i]) > 0) + if (connected[i] > 0) count++; } @@ -238,7 +242,7 @@ void __connman_notifier_register(enum connman_service_type type) break; } - if (g_atomic_int_exchange_and_add(®istered[type], 1) == 0) + if (__sync_fetch_and_add(®istered[type], 1) == 0) technology_registered(type, TRUE); } @@ -246,7 +250,8 @@ void __connman_notifier_unregister(enum connman_service_type type) { DBG("type %d", type); - if (g_atomic_int_get(®istered[type]) == 0) { + __sync_synchronize(); + if (registered[type] == 0) { connman_error("notifier unregister underflow"); return; } @@ -266,8 +271,10 @@ void __connman_notifier_unregister(enum connman_service_type type) break; } - if (g_atomic_int_dec_and_test(®istered[type]) == TRUE) - technology_registered(type, FALSE); + if (__sync_fetch_and_sub(®istered[type], 1) != 1) + return; + + technology_registered(type, FALSE); } void __connman_notifier_enable(enum connman_service_type type) @@ -289,7 +296,7 @@ void __connman_notifier_enable(enum connman_service_type type) break; } - if (g_atomic_int_exchange_and_add(&enabled[type], 1) == 0) + if (__sync_fetch_and_add(&enabled[type], 1) == 0) technology_enabled(type, TRUE); } @@ -297,7 +304,8 @@ void __connman_notifier_disable(enum connman_service_type type) { DBG("type %d", type); - if (g_atomic_int_get(&enabled[type]) == 0) { + __sync_synchronize(); + if (enabled[type] == 0) { connman_error("notifier disable underflow"); return; } @@ -317,8 +325,10 @@ void __connman_notifier_disable(enum connman_service_type type) break; } - if (g_atomic_int_dec_and_test(&enabled[type]) == TRUE) - technology_enabled(type, FALSE); + if (__sync_fetch_and_sub(&enabled[type], 1) != 1) + return; + + technology_enabled(type, FALSE); } void __connman_notifier_connect(enum connman_service_type type) @@ -340,7 +350,7 @@ void __connman_notifier_connect(enum connman_service_type type) break; } - if (g_atomic_int_exchange_and_add(&connected[type], 1) == 0) + if (__sync_fetch_and_add(&connected[type], 1) == 0) technology_connected(type, TRUE); } @@ -348,7 +358,8 @@ void __connman_notifier_disconnect(enum connman_service_type type) { DBG("type %d", type); - if (g_atomic_int_get(&connected[type]) == 0) { + __sync_synchronize(); + if (connected[type] == 0) { connman_error("notifier disconnect underflow"); return; } @@ -368,8 +379,10 @@ void __connman_notifier_disconnect(enum connman_service_type type) break; } - if (g_atomic_int_dec_and_test(&connected[type]) == TRUE) - technology_connected(type, FALSE); + if (__sync_fetch_and_sub(&connected[type], 1) != 1) + return; + + technology_connected(type, FALSE); } static void technology_default(enum connman_service_type type) @@ -577,7 +590,8 @@ connman_bool_t __connman_notifier_is_registered(enum connman_service_type type) if (technology_supported(type) == FALSE) return FALSE; - if (g_atomic_int_get(®istered[type]) > 0) + __sync_synchronize(); + if (registered[type] > 0) return TRUE; return FALSE; @@ -590,7 +604,8 @@ connman_bool_t __connman_notifier_is_enabled(enum connman_service_type type) if (technology_supported(type) == FALSE) return FALSE; - if (g_atomic_int_get(&enabled[type]) > 0) + __sync_synchronize(); + if (enabled[type] > 0) return TRUE; return FALSE; |