summaryrefslogtreecommitdiff
path: root/src/notifier.c
diff options
context:
space:
mode:
authorDaniel Wagner <daniel.wagner@bmw-carit.de>2011-10-31 13:19:09 +0100
committerSamuel Ortiz <sameo@linux.intel.com>2011-11-10 13:09:50 +0100
commit9232d39e6a0738b750e97efd04124c81b7b2e583 (patch)
tree23b4bc3d39f0c6b16a55e8bc9df760e220f2c749 /src/notifier.c
parent6bd851d905799dfb02e66eadc37c2e85b4b8f402 (diff)
downloadconnman-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.c57
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(&registered[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(&registered[type], 1) == 0)
+ if (__sync_fetch_and_add(&registered[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(&registered[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(&registered[type]) == TRUE)
- technology_registered(type, FALSE);
+ if (__sync_fetch_and_sub(&registered[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(&registered[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;