diff options
author | Jukka Rissanen <jukka.rissanen@linux.intel.com> | 2012-01-18 16:46:34 +0200 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2012-01-20 01:42:07 +0100 |
commit | 3a2ffc682f7517b06fdb16563a09a57946ce7811 (patch) | |
tree | 42306b7e08940ca2bacb7c97668fddd73cd735d8 | |
parent | 9b63518d2fa44052fb5de9d9d671320934fe0738 (diff) | |
download | connman-3a2ffc682f7517b06fdb16563a09a57946ce7811.tar.gz connman-3a2ffc682f7517b06fdb16563a09a57946ce7811.tar.bz2 connman-3a2ffc682f7517b06fdb16563a09a57946ce7811.zip |
service: Refactor the service unref function
-rw-r--r-- | src/connman.h | 2 | ||||
-rw-r--r-- | src/provider.c | 7 | ||||
-rw-r--r-- | 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); } /** |