summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2009-04-12 18:59:29 +0200
committerMarcel Holtmann <marcel@holtmann.org>2009-04-12 18:59:29 +0200
commit5b0124db48a7ba6f4f704c546a48e3298941aae3 (patch)
treec8ebd5a5babf003dcb727a9f9d3cf97861dfb85c
parent18d986264ac2c908ef4b709cb7493e4f5525b9ba (diff)
downloadconnman-5b0124db48a7ba6f4f704c546a48e3298941aae3.tar.gz
connman-5b0124db48a7ba6f4f704c546a48e3298941aae3.tar.bz2
connman-5b0124db48a7ba6f4f704c546a48e3298941aae3.zip
Add service creation and reference counting functions
-rw-r--r--include/service.h4
-rw-r--r--src/service.c93
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("");