From 3a2ffc682f7517b06fdb16563a09a57946ce7811 Mon Sep 17 00:00:00 2001 From: Jukka Rissanen Date: Wed, 18 Jan 2012 16:46:34 +0200 Subject: service: Refactor the service unref function --- src/connman.h | 2 -- src/provider.c | 7 +++---- src/service.c | 50 ++++++++++++++++++++------------------------------ 3 files changed, 23 insertions(+), 36 deletions(-) diff --git a/src/connman.h b/src/connman.h index a4a51855..f46ecbb9 100644 --- a/src/connman.h +++ b/src/connman.h @@ -496,8 +496,6 @@ void __connman_service_cleanup(void); void __connman_service_list(DBusMessageIter *iter, void *user_data); void __connman_service_list_struct(DBusMessageIter *iter); -void __connman_service_put(struct connman_service *service); - struct connman_service *__connman_service_lookup_from_network(struct connman_network *network); struct connman_service *__connman_service_lookup_from_index(int index); struct connman_service *__connman_service_create_from_network(struct connman_network *network); diff --git a/src/provider.c b/src/provider.c index 92158e2c..0d9139c3 100644 --- a/src/provider.c +++ b/src/provider.c @@ -456,12 +456,11 @@ int connman_provider_indicate_error(struct connman_provider *provider, static void unregister_provider(gpointer data) { struct connman_provider *provider = data; - struct connman_service *service = provider->vpn_service; - DBG("provider %p", provider); + DBG("provider %p service %p", provider, provider->vpn_service); + connman_service_unref(provider->vpn_service); provider->vpn_service = NULL; - __connman_service_put(service); connman_provider_unref(provider); } @@ -661,7 +660,7 @@ int __connman_provider_create_and_connect(DBusMessage *msg) return 0; failed: - __connman_service_put(provider->vpn_service); + connman_service_unref(provider->vpn_service); provider->vpn_service = NULL; unref: diff --git a/src/service.c b/src/service.c index 47890654..d6c6be09 100644 --- a/src/service.c +++ b/src/service.c @@ -3436,33 +3436,6 @@ static void service_free(gpointer user_data) g_free(service); } -/** - * __connman_service_put: - * @service: service structure - * - * Release service if no longer needed - */ -void __connman_service_put(struct connman_service *service) -{ - GSequenceIter *iter; - - DBG("service %p ref %d", service, service->refcount - 1); - - 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); - - __connman_service_disconnect(service); - - g_sequence_remove(iter); - } else { - service_free(service); - } -} - static void stats_init(struct connman_service *service) { /* home */ @@ -3571,11 +3544,28 @@ struct connman_service *connman_service_ref(struct connman_service *service) * connman_service_unref: * @service: service structure * - * Decrease reference counter of service + * Decrease reference counter of service and release service if no + * longer needed. */ void connman_service_unref(struct connman_service *service) { - __connman_service_put(service); + GSequenceIter *iter; + + DBG("service %p ref %d", service, service->refcount - 1); + + 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); + + __connman_service_disconnect(service); + + g_sequence_remove(iter); + } else { + service_free(service); + } } static gint service_compare(gconstpointer a, gconstpointer b, @@ -5350,7 +5340,7 @@ void __connman_service_remove_from_network(struct connman_network *network) __connman_connection_gateway_remove(service, CONNMAN_IPCONFIG_TYPE_ALL); - __connman_service_put(service); + connman_service_unref(service); } /** -- cgit v1.2.3