summaryrefslogtreecommitdiff
path: root/src/service.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/service.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/service.c')
-rw-r--r--src/service.c34
1 files changed, 18 insertions, 16 deletions
diff --git a/src/service.c b/src/service.c
index 0026e167..30bf2fb0 100644
--- a/src/service.c
+++ b/src/service.c
@@ -56,8 +56,8 @@ struct connman_stats_counter {
};
struct connman_service {
- gint refcount;
- gint session_usage_count;
+ int refcount;
+ int session_usage_count;
char *identifier;
char *path;
enum connman_service_type type;
@@ -1985,17 +1985,17 @@ GSequence *__connman_service_get_list(struct connman_session *session,
void __connman_service_session_inc(struct connman_service *service)
{
DBG("service %p ref count %d", service,
- g_atomic_int_get(&service->session_usage_count) + 1);
+ service->session_usage_count + 1);
- g_atomic_int_inc(&service->session_usage_count);
+ __sync_fetch_and_add(&service->session_usage_count, 1);
}
connman_bool_t __connman_service_session_dec(struct connman_service *service)
{
DBG("service %p ref count %d", service,
- g_atomic_int_get(&service->session_usage_count) - 1);
+ service->session_usage_count - 1);
- if (g_atomic_int_dec_and_test(&service->session_usage_count) == FALSE)
+ if (__sync_fetch_and_sub(&service->session_usage_count, 1) != 1)
return FALSE;
return TRUE;
@@ -3456,20 +3456,22 @@ static void service_free(gpointer user_data)
*/
void __connman_service_put(struct connman_service *service)
{
+ GSequenceIter *iter;
+
DBG("service %p", service);
- if (g_atomic_int_dec_and_test(&service->refcount) == TRUE) {
- GSequenceIter *iter;
+ if (__sync_fetch_and_sub(&service->refcount, 1) != 1)
+ return;
- iter = g_hash_table_lookup(service_hash, service->identifier);
- if (iter != NULL) {
- reply_pending(service, ECONNABORTED);
+ iter = g_hash_table_lookup(service_hash, service->identifier);
+ if (iter != NULL) {
+ reply_pending(service, ECONNABORTED);
- __connman_service_disconnect(service);
+ __connman_service_disconnect(service);
- g_sequence_remove(iter);
- } else
- service_free(service);
+ g_sequence_remove(iter);
+ } else {
+ service_free(service);
}
}
@@ -3574,7 +3576,7 @@ struct connman_service *connman_service_ref(struct connman_service *service)
{
DBG("%p", service);
- g_atomic_int_inc(&service->refcount);
+ __sync_fetch_and_add(&service->refcount, 1);
return service;
}