Add service creation and reference counting functions
authorMarcel Holtmann <marcel@holtmann.org>
Sun, 12 Apr 2009 16:59:29 +0000 (18:59 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Sun, 12 Apr 2009 16:59:29 +0000 (18:59 +0200)
include/service.h
src/service.c

index e83911c..17f46b8 100644 (file)
@@ -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);
 
index 9fed451..b921f5f 100644 (file)
@@ -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("");