diff --git a/src/nm-active-connection.c b/src/nm-active-connection.c index 6e3a5da63c..a47d2ae20d 100644 --- a/src/nm-active-connection.c +++ b/src/nm-active-connection.c @@ -217,8 +217,7 @@ nm_active_connection_export (NMActiveConnection *self) priv->path = g_strdup_printf (NM_DBUS_PATH "/ActiveConnection/%d", counter++); dbus_mgr = nm_dbus_manager_get (); - dbus_g_connection_register_g_object (nm_dbus_manager_get_connection (dbus_mgr), - priv->path, G_OBJECT (self)); + nm_dbus_manager_register_object (dbus_mgr, priv->path, self); g_object_unref (dbus_mgr); } diff --git a/src/nm-dbus-manager.c b/src/nm-dbus-manager.c index 8552f559e9..34a2f7f817 100644 --- a/src/nm-dbus-manager.c +++ b/src/nm-dbus-manager.c @@ -48,6 +48,7 @@ G_DEFINE_TYPE(NMDBusManager, nm_dbus_manager, G_TYPE_OBJECT) typedef struct { DBusConnection *connection; DBusGConnection *g_connection; + GHashTable *exported; gboolean started; DBusGProxy *proxy; @@ -59,6 +60,7 @@ typedef struct { static gboolean nm_dbus_manager_init_bus (NMDBusManager *self); 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); NMDBusManager * nm_dbus_manager_get (void) @@ -80,14 +82,29 @@ nm_dbus_manager_get (void) static void nm_dbus_manager_init (NMDBusManager *self) { + NMDBusManagerPrivate *priv = NM_DBUS_MANAGER_GET_PRIVATE (self); + + priv->exported = g_hash_table_new (g_direct_hash, g_direct_equal); } static void nm_dbus_manager_dispose (GObject *object) { - NMDBusManagerPrivate *priv = NM_DBUS_MANAGER_GET_PRIVATE (object); + NMDBusManager *self = NM_DBUS_MANAGER (object); + NMDBusManagerPrivate *priv = NM_DBUS_MANAGER_GET_PRIVATE (self); + GHashTableIter iter; + GObject *exported; - nm_dbus_manager_cleanup (NM_DBUS_MANAGER (object), TRUE); + if (priv->exported) { + g_hash_table_iter_init (&iter, priv->exported); + while (g_hash_table_iter_next (&iter, (gpointer) &exported, NULL)) + g_object_weak_unref (exported, (GWeakNotify) object_destroyed, self); + + g_hash_table_destroy (priv->exported); + priv->exported = NULL; + } + + nm_dbus_manager_cleanup (self, TRUE); if (priv->reconnect_id) { g_source_remove (priv->reconnect_id); @@ -358,3 +375,38 @@ nm_dbus_manager_get_connection (NMDBusManager *self) return NM_DBUS_MANAGER_GET_PRIVATE (self)->g_connection; } + +static void +object_destroyed (NMDBusManager *self, gpointer object) +{ + g_hash_table_remove (NM_DBUS_MANAGER_GET_PRIVATE (self)->exported, object); +} + +void +nm_dbus_manager_register_object (NMDBusManager *self, + const char *path, + gpointer object) +{ + NMDBusManagerPrivate *priv = NM_DBUS_MANAGER_GET_PRIVATE (self); + + g_assert (G_IS_OBJECT (object)); + + g_warn_if_fail (g_hash_table_lookup (priv->exported, object) == NULL); + g_hash_table_insert (priv->exported, G_OBJECT (object), GUINT_TO_POINTER (1)); + + dbus_g_connection_register_g_object (priv->g_connection, path, G_OBJECT (object)); + g_object_weak_ref (G_OBJECT (object), (GWeakNotify) object_destroyed, self); +} + +void +nm_dbus_manager_unregister_object (NMDBusManager *self, gpointer object) +{ + NMDBusManagerPrivate *priv = NM_DBUS_MANAGER_GET_PRIVATE (self); + + g_assert (G_IS_OBJECT (object)); + + g_hash_table_remove (NM_DBUS_MANAGER_GET_PRIVATE (self)->exported, G_OBJECT (object)); + g_object_weak_unref (G_OBJECT (object), (GWeakNotify) object_destroyed, self); + dbus_g_connection_unregister_g_object (priv->g_connection, G_OBJECT (object)); +} + diff --git a/src/nm-dbus-manager.h b/src/nm-dbus-manager.h index 83ffa9667e..0a27f14522 100644 --- a/src/nm-dbus-manager.h +++ b/src/nm-dbus-manager.h @@ -75,6 +75,12 @@ gboolean nm_dbus_manager_name_has_owner (NMDBusManager *self, DBusConnection * nm_dbus_manager_get_dbus_connection (NMDBusManager *self); DBusGConnection * nm_dbus_manager_get_connection (NMDBusManager *self); +void nm_dbus_manager_register_object (NMDBusManager *self, + const char *path, + gpointer object); + +void nm_dbus_manager_unregister_object (NMDBusManager *self, gpointer object); + G_END_DECLS #endif /* __NM_DBUS_MANAGER_H__ */ diff --git a/src/nm-dhcp4-config.c b/src/nm-dhcp4-config.c index 567ba68750..e9ddb9b93c 100644 --- a/src/nm-dhcp4-config.c +++ b/src/nm-dhcp4-config.c @@ -140,13 +140,11 @@ nm_dhcp4_config_init (NMDHCP4Config *self) { NMDHCP4ConfigPrivate *priv = NM_DHCP4_CONFIG_GET_PRIVATE (self); static guint32 counter = 0; - DBusGConnection *connection; NMDBusManager *dbus_mgr; dbus_mgr = nm_dbus_manager_get (); - connection = nm_dbus_manager_get_connection (dbus_mgr); priv->dbus_path = g_strdup_printf (NM_DBUS_PATH "/DHCP4Config/%d", counter++); - dbus_g_connection_register_g_object (connection, priv->dbus_path, G_OBJECT (self)); + nm_dbus_manager_register_object (dbus_mgr, priv->dbus_path, self); g_object_unref (dbus_mgr); priv->options = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, nm_gvalue_destroy); diff --git a/src/nm-dhcp6-config.c b/src/nm-dhcp6-config.c index 885e5f840a..4e2ab9e963 100644 --- a/src/nm-dhcp6-config.c +++ b/src/nm-dhcp6-config.c @@ -140,13 +140,11 @@ nm_dhcp6_config_init (NMDHCP6Config *self) { NMDHCP6ConfigPrivate *priv = NM_DHCP6_CONFIG_GET_PRIVATE (self); static guint32 counter = 0; - DBusGConnection *connection; NMDBusManager *dbus_mgr; dbus_mgr = nm_dbus_manager_get (); - connection = nm_dbus_manager_get_connection (dbus_mgr); priv->dbus_path = g_strdup_printf (NM_DBUS_PATH "/DHCP6Config/%d", counter++); - dbus_g_connection_register_g_object (connection, priv->dbus_path, G_OBJECT (self)); + nm_dbus_manager_register_object (dbus_mgr, priv->dbus_path, self); g_object_unref (dbus_mgr); priv->options = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, nm_gvalue_destroy); diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c index 0722981e46..07e423ee1f 100644 --- a/src/nm-ip4-config.c +++ b/src/nm-ip4-config.c @@ -102,7 +102,6 @@ nm_ip4_config_export (NMIP4Config *config) { NMIP4ConfigPrivate *priv; NMDBusManager *dbus_mgr; - DBusGConnection *connection; static guint32 counter = 0; g_return_if_fail (NM_IS_IP4_CONFIG (config)); @@ -111,10 +110,8 @@ nm_ip4_config_export (NMIP4Config *config) g_return_if_fail (priv->path == NULL); dbus_mgr = nm_dbus_manager_get (); - connection = nm_dbus_manager_get_connection (dbus_mgr); priv->path = g_strdup_printf (NM_DBUS_PATH "/IP4Config/%d", counter++); - - dbus_g_connection_register_g_object (connection, priv->path, G_OBJECT (config)); + nm_dbus_manager_register_object (dbus_mgr, priv->path, config); g_object_unref (dbus_mgr); } diff --git a/src/nm-ip6-config.c b/src/nm-ip6-config.c index 511cbf4693..65c947f70a 100644 --- a/src/nm-ip6-config.c +++ b/src/nm-ip6-config.c @@ -99,7 +99,6 @@ nm_ip6_config_export (NMIP6Config *config) { NMIP6ConfigPrivate *priv; NMDBusManager *dbus_mgr; - DBusGConnection *connection; static guint32 counter = 0; g_return_if_fail (NM_IS_IP6_CONFIG (config)); @@ -108,10 +107,8 @@ nm_ip6_config_export (NMIP6Config *config) g_return_if_fail (priv->path == NULL); dbus_mgr = nm_dbus_manager_get (); - connection = nm_dbus_manager_get_connection (dbus_mgr); priv->path = g_strdup_printf (NM_DBUS_PATH "/IP6Config/%d", counter++); - - dbus_g_connection_register_g_object (connection, priv->path, G_OBJECT (config)); + nm_dbus_manager_register_object (dbus_mgr, priv->path, config); g_object_unref (dbus_mgr); } diff --git a/src/nm-manager.c b/src/nm-manager.c index ec019a617f..55b6c8a50e 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -1892,9 +1892,7 @@ add_device (NMManager *self, NMDevice *device) path = g_strdup_printf ("/org/freedesktop/NetworkManager/Devices/%d", devcount++); nm_device_set_path (device, path); - dbus_g_connection_register_g_object (nm_dbus_manager_get_connection (priv->dbus_mgr), - path, - G_OBJECT (device)); + nm_dbus_manager_register_object (priv->dbus_mgr, path, device); nm_log_info (LOGD_CORE, "(%s): exported as %s", iface, path); g_free (path); @@ -4124,7 +4122,7 @@ nm_manager_new (NMSettings *settings, g_signal_connect (priv->settings, NM_SETTINGS_SIGNAL_CONNECTION_VISIBILITY_CHANGED, G_CALLBACK (connection_changed), singleton); - dbus_g_connection_register_g_object (bus, NM_DBUS_PATH, G_OBJECT (singleton)); + nm_dbus_manager_register_object (priv->dbus_mgr, NM_DBUS_PATH, singleton); priv->udev_mgr = nm_udev_manager_new (); g_signal_connect (priv->udev_mgr, diff --git a/src/nm-wifi-ap.c b/src/nm-wifi-ap.c index 9be3de31a7..f093505182 100644 --- a/src/nm-wifi-ap.c +++ b/src/nm-wifi-ap.c @@ -318,7 +318,6 @@ nm_ap_export_to_dbus (NMAccessPoint *ap) { NMAccessPointPrivate *priv; NMDBusManager *mgr; - DBusGConnection *g_connection; static guint32 counter = 0; g_return_if_fail (NM_IS_AP (ap)); @@ -331,14 +330,8 @@ nm_ap_export_to_dbus (NMAccessPoint *ap) } mgr = nm_dbus_manager_get (); - g_assert (mgr); - - g_connection = nm_dbus_manager_get_connection (mgr); - g_assert (g_connection); - priv->dbus_path = g_strdup_printf (NM_DBUS_PATH_ACCESS_POINT "/%d", counter++); - dbus_g_connection_register_g_object (g_connection, priv->dbus_path, G_OBJECT (ap)); - + nm_dbus_manager_register_object (mgr, priv->dbus_path, ap); g_object_unref (mgr); } diff --git a/src/settings/nm-agent-manager.c b/src/settings/nm-agent-manager.c index 3256e1816c..545cc1d0e9 100644 --- a/src/settings/nm-agent-manager.c +++ b/src/settings/nm-agent-manager.c @@ -1402,7 +1402,6 @@ nm_agent_manager_get (void) { static NMAgentManager *singleton = NULL; NMAgentManagerPrivate *priv; - DBusGConnection *connection; if (singleton) return g_object_ref (singleton); @@ -1414,10 +1413,7 @@ nm_agent_manager_get (void) priv->session_monitor = nm_session_monitor_get (); priv->dbus_mgr = nm_dbus_manager_get (); - connection = nm_dbus_manager_get_connection (priv->dbus_mgr); - dbus_g_connection_register_g_object (connection, - NM_DBUS_PATH_AGENT_MANAGER, - G_OBJECT (singleton)); + nm_dbus_manager_register_object (priv->dbus_mgr, NM_DBUS_PATH_AGENT_MANAGER, singleton); g_signal_connect (priv->dbus_mgr, NM_DBUS_MANAGER_NAME_OWNER_CHANGED, diff --git a/src/settings/nm-settings.c b/src/settings/nm-settings.c index 5d01c8444f..a8ae434553 100644 --- a/src/settings/nm-settings.c +++ b/src/settings/nm-settings.c @@ -117,7 +117,6 @@ G_DEFINE_TYPE_EXTENDED (NMSettings, nm_settings, G_TYPE_OBJECT, 0, typedef struct { NMDBusManager *dbus_mgr; - DBusGConnection *bus; NMAgentManager *agent_mgr; @@ -707,7 +706,7 @@ connection_unregister (NMSettingsConnection *obj, gpointer user_data) guint id; /* Make sure it's unregistered from the bus now that's removed */ - dbus_g_connection_unregister_g_object (priv->bus, connection); + nm_dbus_manager_unregister_object (priv->dbus_mgr, connection); id = GPOINTER_TO_UINT (g_object_get_data (connection, UNREG_ID_TAG)); if (id) @@ -856,7 +855,7 @@ claim_connection (NMSettings *self, g_warn_if_fail (nm_connection_get_path (NM_CONNECTION (connection)) == NULL); path = g_strdup_printf ("%s/%u", NM_DBUS_PATH_SETTINGS, ec_counter++); nm_connection_set_path (NM_CONNECTION (connection), path); - dbus_g_connection_register_g_object (priv->bus, path, G_OBJECT (connection)); + nm_dbus_manager_register_object (priv->dbus_mgr, path, G_OBJECT (connection)); g_free (path); g_hash_table_insert (priv->connections, @@ -1615,7 +1614,6 @@ nm_settings_new (GError **error) priv->config = nm_config_get (); priv->dbus_mgr = nm_dbus_manager_get (); - priv->bus = nm_dbus_manager_get_connection (priv->dbus_mgr); /* Load the plugins; fail if a plugin is not found. */ if (!load_plugins (self, nm_config_get_plugins (priv->config), error)) { @@ -1625,7 +1623,7 @@ nm_settings_new (GError **error) unmanaged_specs_changed (NULL, self); - dbus_g_connection_register_g_object (priv->bus, NM_DBUS_PATH_SETTINGS, G_OBJECT (self)); + nm_dbus_manager_register_object (priv->dbus_mgr, NM_DBUS_PATH_SETTINGS, self); return self; } diff --git a/src/wimax/nm-wimax-nsp.c b/src/wimax/nm-wimax-nsp.c index e3939b70fb..42083ee554 100644 --- a/src/wimax/nm-wimax-nsp.c +++ b/src/wimax/nm-wimax-nsp.c @@ -96,7 +96,6 @@ nm_wimax_nsp_export_to_dbus (NMWimaxNsp *self) { NMWimaxNspPrivate *priv; NMDBusManager *mgr; - DBusGConnection *g_connection; static guint32 counter = 0; g_return_if_fail (NM_IS_WIMAX_NSP (self)); @@ -106,14 +105,8 @@ nm_wimax_nsp_export_to_dbus (NMWimaxNsp *self) g_return_if_fail (priv->dbus_path == NULL); mgr = nm_dbus_manager_get (); - g_assert (mgr); - - g_connection = nm_dbus_manager_get_connection (mgr); - g_assert (g_connection); - priv->dbus_path = g_strdup_printf (NM_DBUS_PATH_WIMAX_NSP "/%d", counter++); - dbus_g_connection_register_g_object (g_connection, priv->dbus_path, G_OBJECT (self)); - + nm_dbus_manager_register_object (mgr, priv->dbus_path, self); g_object_unref (mgr); }