diff options
| author | Michael Biebl <biebl@debian.org> | 2015-05-05 17:48:57 +0200 |
|---|---|---|
| committer | Michael Biebl <biebl@debian.org> | 2015-05-05 17:48:57 +0200 |
| commit | f408e27bccfacf347605a8d98649975a68f38a17 (patch) | |
| tree | 654fd6695c31511baf919b1c0870d119a352ed75 /src/nm-dbus-manager.c | |
| parent | 2c032d8f1c6292c1338a615e6ec40252889ba85c (diff) | |
Imported Upstream version 1.0.2 upstream/1.0.2
Diffstat (limited to 'src/nm-dbus-manager.c')
| -rw-r--r-- | src/nm-dbus-manager.c | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/src/nm-dbus-manager.c b/src/nm-dbus-manager.c index 1cceb9b5..f57eeb8e 100644 --- a/src/nm-dbus-manager.c +++ b/src/nm-dbus-manager.c @@ -78,20 +78,33 @@ static void nm_dbus_manager_cleanup (NMDBusManager *self, gboolean dispose); static void start_reconnection_timeout (NMDBusManager *self); static void object_destroyed (NMDBusManager *self, gpointer object); +NM_DEFINE_SINGLETON_DESTRUCTOR (NMDBusManager); +NM_DEFINE_SINGLETON_WEAK_REF (NMDBusManager); + NMDBusManager * nm_dbus_manager_get (void) { - static NMDBusManager *singleton = NULL; - static gsize once = 0; - - if (g_once_init_enter (&once)) { - singleton = (NMDBusManager *) g_object_new (NM_TYPE_DBUS_MANAGER, NULL); - g_assert (singleton); - if (!nm_dbus_manager_init_bus (singleton)) - start_reconnection_timeout (singleton); - g_once_init_leave (&once, 1); + if (G_UNLIKELY (!singleton_instance)) { + nm_dbus_manager_setup (g_object_new (NM_TYPE_DBUS_MANAGER, NULL)); + if (!nm_dbus_manager_init_bus (singleton_instance)) + start_reconnection_timeout (singleton_instance); } - return singleton; + return singleton_instance; +} + +void +nm_dbus_manager_setup (NMDBusManager *instance) +{ + static char already_setup = FALSE; + + g_assert (NM_IS_DBUS_MANAGER (instance)); + g_assert (!already_setup); + g_assert (!singleton_instance); + + already_setup = TRUE; + singleton_instance = instance; + nm_singleton_instance_weak_ref_register (); + nm_log_dbg (LOGD_CORE, "create %s singleton (%p)", "NMDBusManager", singleton_instance); } /**************************************************************/ @@ -199,6 +212,7 @@ private_server_new (const char *path, nm_log_warn (LOGD_CORE, "(%s) failed to set up private socket %s: %s", tag, address, error.message); dbus_error_free (&error); + g_free (address); return NULL; } @@ -876,8 +890,11 @@ nm_dbus_manager_register_object (NMDBusManager *self, g_assert (G_IS_OBJECT (object)); - g_warn_if_fail (g_hash_table_lookup (priv->exported, object) == NULL); + if (g_hash_table_lookup (priv->exported, G_OBJECT (object))) + g_return_if_reached (); + g_hash_table_insert (priv->exported, G_OBJECT (object), g_strdup (path)); + g_object_weak_ref (G_OBJECT (object), (GWeakNotify) object_destroyed, self); if (priv->g_connection) dbus_g_connection_register_g_object (priv->g_connection, path, G_OBJECT (object)); @@ -890,8 +907,6 @@ nm_dbus_manager_register_object (NMDBusManager *self, G_OBJECT (object)); } } - - g_object_weak_ref (G_OBJECT (object), (GWeakNotify) object_destroyed, self); } void @@ -903,7 +918,10 @@ nm_dbus_manager_unregister_object (NMDBusManager *self, gpointer object) g_assert (G_IS_OBJECT (object)); - g_hash_table_remove (NM_DBUS_MANAGER_GET_PRIVATE (self)->exported, G_OBJECT (object)); + if (!g_hash_table_lookup (priv->exported, G_OBJECT (object))) + g_return_if_reached (); + + g_hash_table_remove (priv->exported, G_OBJECT (object)); g_object_weak_unref (G_OBJECT (object), (GWeakNotify) object_destroyed, self); if (priv->g_connection) |