diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2009-04-12 18:59:29 +0200 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2009-04-12 18:59:29 +0200 |
commit | 5b0124db48a7ba6f4f704c546a48e3298941aae3 (patch) | |
tree | c8ebd5a5babf003dcb727a9f9d3cf97861dfb85c | |
parent | 18d986264ac2c908ef4b709cb7493e4f5525b9ba (diff) | |
download | connman-5b0124db48a7ba6f4f704c546a48e3298941aae3.tar.gz connman-5b0124db48a7ba6f4f704c546a48e3298941aae3.tar.bz2 connman-5b0124db48a7ba6f4f704c546a48e3298941aae3.zip |
Add service creation and reference counting functions
-rw-r--r-- | include/service.h | 4 | ||||
-rw-r--r-- | src/service.c | 93 |
2 files changed, 81 insertions, 16 deletions
diff --git a/include/service.h b/include/service.h index e83911c9..17f46b87 100644 --- a/include/service.h +++ b/include/service.h @@ -65,6 +65,10 @@ enum connman_service_state { struct connman_service; +extern struct connman_service *connman_service_create(void); +extern struct connman_service *connman_service_ref(struct connman_service *service); +extern void connman_service_unref(struct connman_service *service); + extern struct connman_service *connman_service_get(const char *identifier); extern void connman_service_put(struct connman_service *service); diff --git a/src/service.c b/src/service.c index 9fed4515..b921f5fc 100644 --- a/src/service.c +++ b/src/service.c @@ -57,6 +57,81 @@ static void service_free(gpointer data) g_free(service); } +void connman_service_put(struct connman_service *service) +{ + DBG("service %p", service); + + if (g_atomic_int_dec_and_test(&service->refcount) == TRUE) { + GSequenceIter *iter; + + iter = g_hash_table_lookup(service_hash, service->identifier); + if (iter != NULL) + g_sequence_remove(iter); + else + service_free(service); + } +} + +static void __connman_service_initialize(struct connman_service *service) +{ + DBG("service %p", service); + + service->refcount = 1; + + service->type = CONNMAN_SERVICE_TYPE_UNKNOWN; + service->mode = CONNMAN_SERVICE_MODE_UNKNOWN; + service->security = CONNMAN_SERVICE_SECURITY_UNKNOWN; + service->state = CONNMAN_SERVICE_STATE_UNKNOWN; + + service->favorite = FALSE; +} + +/** + * connman_service_create: + * + * Allocate a new service. + * + * Returns: a newly-allocated #connman_service structure + */ +struct connman_service *connman_service_create(void) +{ + struct connman_service *service; + + service = g_try_new0(struct connman_service, 1); + if (service == NULL) + return NULL; + + DBG("service %p", service); + + __connman_service_initialize(service); + + return service; +} + +/** + * connman_service_ref: + * @service: service structure + * + * Increase reference counter of service + */ +struct connman_service *connman_service_ref(struct connman_service *service) +{ + g_atomic_int_inc(&service->refcount); + + return service; +} + +/** + * connman_service_unref: + * @service: service structure + * + * Decrease reference counter of service + */ +void connman_service_unref(struct connman_service *service) +{ + connman_service_put(service); +} + static gint service_compare(gconstpointer a, gconstpointer b, gpointer user_data) { @@ -91,7 +166,8 @@ struct connman_service *connman_service_get(const char *identifier) DBG("service %p", service); - service->refcount = 1; + __connman_service_initialize(service); + service->identifier = g_strdup(identifier); iter = g_sequence_insert_sorted(service_list, service, @@ -102,21 +178,6 @@ struct connman_service *connman_service_get(const char *identifier) return service; } -void connman_service_put(struct connman_service *service) -{ - DBG("service %p", service); - - if (g_atomic_int_dec_and_test(&service->refcount) == TRUE) { - GSequenceIter *iter; - - iter = g_hash_table_lookup(service_hash, service->identifier); - if (iter != NULL) - g_sequence_remove(iter); - else - service_free(service); - } -} - int __connman_service_init(void) { DBG(""); |