From 9232d39e6a0738b750e97efd04124c81b7b2e583 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Mon, 31 Oct 2011 13:19:09 +0100 Subject: 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. --- src/service.c | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) (limited to 'src/service.c') 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; } -- cgit v1.2.3