extension: moved global statics to Extension object and clean properly.
authorAmarnath Valluri <amarnath.valluri@linux.intel.com>
Mon, 13 May 2013 13:45:32 +0000 (16:45 +0300)
committerJussi Laako <jussi.laako@linux.intel.com>
Tue, 14 May 2013 11:56:01 +0000 (14:56 +0300)
src/common/gsignond-extension-interface.c
src/daemon/gsignond-daemon.c
src/extensions/tizen/tizen-extension.c

index 22aeb20..45362b4 100644 (file)
 
 G_DEFINE_TYPE (GSignondExtension, gsignond_extension, G_TYPE_OBJECT);
 
-static GSignondExtension *default_extension = NULL;
-static GSignondStorageManager *storage_manager_inst = NULL;
-static GSignondSecretStorage *secret_storage_inst = NULL;
-static GSignondAccessControlManager *access_control_manager_inst = NULL;
+#define GSIGNOND_EXTENSION_PRIV(obj) G_TYPE_INSTANCE_GET_PRIVATE ((obj), GSIGNOND_TYPE_EXTENSION, GSignondExtensionPrivate)
+
+struct _GSignondExtensionPrivate 
+{
+    GSignondAccessControlManager *access_control_manager;
+    GSignondStorageManager *storage_manager;
+    GSignondSecretStorage *secret_storage;
+};
 
 static void
 _dispose (GObject *object)
 {
-    g_clear_object (&storage_manager_inst);
-    g_clear_object (&secret_storage_inst);
-    g_clear_object (&access_control_manager_inst);
+    GSignondExtensionPrivate *priv = GSIGNOND_EXTENSION (object)->priv;
 
-    G_OBJECT_CLASS (gsignond_extension_parent_class)->dispose (object);
+    g_clear_object (&priv->access_control_manager);
+    g_clear_object (&priv->secret_storage);
+    g_clear_object (&priv->storage_manager);
 
-    default_extension = NULL;
+    G_OBJECT_CLASS (gsignond_extension_parent_class)->dispose (object);
 }
 
 static const gchar *
@@ -63,49 +67,59 @@ _get_extension_version (GSignondExtension *self)
 static GSignondStorageManager *
 _get_storage_manager (GSignondExtension *self, GSignondConfig *config)
 {
-    (void) self;
+    g_return_val_if_fail (self && GSIGNOND_IS_EXTENSION (self), NULL);
+
+    GSignondExtensionPrivate *priv = self->priv;
 
-    if (!storage_manager_inst) {
-        storage_manager_inst =
+    if (!priv->storage_manager) {
+        priv->storage_manager =
             g_object_new (GSIGNOND_TYPE_STORAGE_MANAGER,
                           "config", config, NULL);
     }
-    return storage_manager_inst;
+
+    return priv->storage_manager;
 }
 
 static GSignondSecretStorage *
 _get_secret_storage (GSignondExtension *self, GSignondConfig *config)
 {
-    (void) self;
+    g_return_val_if_fail (self && GSIGNOND_IS_EXTENSION (self), NULL);
+
+    GSignondExtensionPrivate *priv = self->priv;
 
-    if (!secret_storage_inst) {
-        secret_storage_inst =
+    if (!priv->secret_storage) {
+        priv->secret_storage =
             g_object_new (GSIGNOND_TYPE_SECRET_STORAGE,
                           "config", config, NULL);
     }
 
-    return secret_storage_inst;
+    return priv->secret_storage;
 }
 
 static GSignondAccessControlManager *
 _get_access_control_manager (GSignondExtension *self, GSignondConfig *config)
 {
-    (void) self;
+    g_return_val_if_fail (self && GSIGNOND_IS_EXTENSION (self), NULL);
+
+    GSignondExtensionPrivate *priv = self->priv;
 
-    if (!access_control_manager_inst) {
-        access_control_manager_inst =
+    if (!priv->access_control_manager) {
+        priv->access_control_manager =
             g_object_new (GSIGNOND_TYPE_ACCESS_CONTROL_MANAGER,
                           "config", config, NULL);
     }
 
-    return access_control_manager_inst;
+    return priv->access_control_manager;
 }
 
-
 static void
 gsignond_extension_class_init (GSignondExtensionClass *klass)
 {
-    G_OBJECT_CLASS (klass)->dispose = _dispose;
+    GObjectClass *g_klass = G_OBJECT_CLASS (klass);
+
+    g_type_class_add_private (g_klass, sizeof (GSignondExtensionPrivate));
+
+    g_klass->dispose = _dispose;
     klass->get_extension_name = _get_extension_name;
     klass->get_extension_version = _get_extension_version;
     klass->get_storage_manager = _get_storage_manager;
@@ -116,14 +130,32 @@ gsignond_extension_class_init (GSignondExtensionClass *klass)
 static void
 gsignond_extension_init (GSignondExtension *self)
 {
+    self->priv = GSIGNOND_EXTENSION_PRIV (self);
+
+    self->priv->access_control_manager = NULL;
+    self->priv->storage_manager = NULL;
+    self->priv->secret_storage = NULL;
+}
+
+static void
+_on_extension_dispose (gpointer data, GObject *object)
+{
+    if (data) *(GSignondExtension **)data = NULL;
 }
 
 GSignondExtension * default_extension_init ()
 {
+    static GSignondExtension *default_extension = NULL;
+
     if (!default_extension) {
         default_extension =
             g_object_new (GSIGNOND_TYPE_EXTENSION, NULL);
+        
+        g_object_weak_ref (G_OBJECT (default_extension),
+                           _on_extension_dispose,
+                           &default_extension);
     }
+
     return default_extension;
 }
 
index 81d14d5..dfeaa09 100644 (file)
@@ -208,7 +208,10 @@ _init_extensions (GSignondDaemon *self)
         self->priv->extension_module =
             g_module_open (mod_filename, G_MODULE_BIND_LOCAL);
         g_free (mod_filename);
-        if (!self->priv->extension_module) return FALSE;
+        if (!self->priv->extension_module) {
+            DBG("failed to load module : %s", g_module_error());
+            return FALSE;
+        }
         initf_name = g_strdup_printf ("%s_extension_init", ext_name);
         symfound = g_module_symbol (self->priv->extension_module,
                                     initf_name,
index b996368..059e461 100644 (file)
 
 G_DEFINE_TYPE (ExtensionTizen, extension_tizen, GSIGNOND_TYPE_EXTENSION);
 
-static GSignondExtension *tizen_extension = NULL;
-static GSignondStorageManager *storage_manager_inst = NULL;
-static GSignondSecretStorage *secret_storage_inst = NULL;
-static GSignondAccessControlManager *access_control_manager_inst = NULL;
+#define EXTENSION_TIZEN_PRIV(obj) G_TYPE_INSTANCE_GET_PRIVATE ((obj), EXTENSION_TYPE_TIZEN, ExtensionTizenPrivate)
+
+struct _ExtensionTizenPrivate
+{
+    GSignondAccessControlManager *access_control_manager;
+    GSignondStorageManager *storage_manager;
+    GSignondSecretStorage *secret_storage;
+};
+
+static void
+_dispose (GObject *obj)
+{
+    ExtensionTizen *self = EXTENSION_TIZEN (obj);
+    if (!self) return;
+
+    ExtensionTizenPrivate *priv = self->priv;
+
+    if (priv) {
+        g_clear_object (&priv->access_control_manager);
+        g_clear_object (&priv->secret_storage);
+        g_clear_object (&priv->storage_manager);
+    }
+
+    G_OBJECT_CLASS (extension_tizen_parent_class)->dispose (obj);
+}
 
 static const gchar *
 _get_extension_name (GSignondExtension *self)
@@ -54,42 +75,48 @@ _get_extension_version (GSignondExtension *self)
 static GSignondStorageManager *
 _get_storage_manager (GSignondExtension *self, GSignondConfig *config)
 {
-    (void) self;
+    g_return_val_if_fail (self && EXTENSION_IS_TIZEN(self), NULL);
+
+    ExtensionTizenPrivate *priv = EXTENSION_TIZEN(self)->priv;
 
-    if (!storage_manager_inst) {
-        storage_manager_inst =
+    if (!priv->storage_manager) {
+        priv->storage_manager =
             g_object_new (EXTENSION_TYPE_TIZEN_STORAGE_MANAGER,
                           "config", config, NULL);
     }
-    return storage_manager_inst;
+    return priv->storage_manager;
 }
 
 static GSignondSecretStorage *
 _get_secret_storage (GSignondExtension *self, GSignondConfig *config)
 {
-    (void) self;
+    g_return_val_if_fail (self && EXTENSION_IS_TIZEN(self), NULL);
 
-    if (!secret_storage_inst) {
-        secret_storage_inst =
+    ExtensionTizenPrivate *priv = EXTENSION_TIZEN(self)->priv;
+
+    if (!priv->secret_storage) {
+        priv->secret_storage =
             g_object_new (EXTENSION_TYPE_TIZEN_SECRET_STORAGE,
                           "config", config, NULL);
     }
 
-    return secret_storage_inst;
+    return priv->secret_storage;
 }
 
 static GSignondAccessControlManager *
 _get_access_control_manager (GSignondExtension *self, GSignondConfig *config)
 {
-    (void) self;
+    g_return_val_if_fail (self && EXTENSION_IS_TIZEN(self), NULL);
+
+    ExtensionTizenPrivate *priv = EXTENSION_TIZEN(self)->priv;
 
-    if (!access_control_manager_inst) {
-        access_control_manager_inst =
+    if (!priv->access_control_manager) {
+        priv->access_control_manager =
             g_object_new (EXTENSION_TYPE_TIZEN_ACCESS_CONTROL_MANAGER,
                           "config", config, NULL);
     }
 
-    return access_control_manager_inst;
+    return priv->access_control_manager;
 }
 
 static void
@@ -97,6 +124,9 @@ extension_tizen_class_init (ExtensionTizenClass *klass)
 {
     GSignondExtensionClass *parent_class = GSIGNOND_EXTENSION_CLASS (klass);
 
+    g_type_class_add_private (G_OBJECT_CLASS(klass), sizeof (ExtensionTizenPrivate));
+
+    G_OBJECT_CLASS (klass)->dispose = _dispose;
     parent_class->get_extension_name = _get_extension_name;
     parent_class->get_extension_version = _get_extension_version;
     parent_class->get_storage_manager = _get_storage_manager;
@@ -107,14 +137,30 @@ extension_tizen_class_init (ExtensionTizenClass *klass)
 static void
 extension_tizen_init (ExtensionTizen *self)
 {
+    self->priv = EXTENSION_TIZEN_PRIV (self);
+
+    self->priv->storage_manager = NULL;
+    self->priv->secret_storage = NULL;
+    self->priv->access_control_manager = NULL;
+}
+
+static void
+_on_object_dispose (gpointer data, GObject *object)
+{
+    if (data) *(ExtensionTizen **)data = NULL;
 }
 
 GSignondExtension *
 tizen_extension_init ()
 {
+    static GSignondExtension *tizen_extension  = NULL;
+
     if (!tizen_extension) {
         tizen_extension = g_object_new (EXTENSION_TYPE_TIZEN, NULL);
+
+        g_object_weak_ref (G_OBJECT (tizen_extension), _on_object_dispose, &tizen_extension);
     }
+
     return tizen_extension;
 }