From e725887c3a6b5ec4df460cfe1124a7c5b090a911 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 5 Jan 2015 17:20:03 +0100 Subject: [PATCH 01/14] all: add macro NM_DEFINE_SINGLETON_GETTER() --- include/nm-utils-internal.h | 60 +++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/include/nm-utils-internal.h b/include/nm-utils-internal.h index c002b6c1ef..7ca44f3c4b 100644 --- a/include/nm-utils-internal.h +++ b/include/nm-utils-internal.h @@ -100,4 +100,64 @@ _found; \ }) +/*****************************************************************************/ + +#define NM_DEFINE_SINGLETON_INSTANCE(TYPE) \ +static TYPE *singleton_instance + +#define NM_DEFINE_SINGLETON_WEAK_REF(TYPE) \ +NM_DEFINE_SINGLETON_INSTANCE (TYPE); \ +static void \ +_singleton_instance_weak_ref_cb (gpointer data, \ + GObject *where_the_object_was) \ +{ \ + nm_log_dbg (LOGD_CORE, "disposing %s singleton (%p)", G_STRINGIFY (TYPE), singleton_instance); \ + singleton_instance = NULL; \ +} \ +static inline void \ +nm_singleton_instance_weak_ref_register (void) \ +{ \ + g_object_weak_ref (G_OBJECT (singleton_instance), _singleton_instance_weak_ref_cb, NULL); \ +} + +#define NM_DEFINE_SINGLETON_DESTRUCTOR(TYPE) \ +NM_DEFINE_SINGLETON_INSTANCE (TYPE); \ +static void __attribute__((destructor)) \ +_singleton_destructor (void) \ +{ \ + if (singleton_instance) { \ + if (G_OBJECT (singleton_instance)->ref_count > 1) \ + nm_log_dbg (LOGD_CORE, "disown %s singleton (%p)", G_STRINGIFY (TYPE), singleton_instance); \ + g_object_unref (singleton_instance); \ + } \ +} + +/* By default, the getter will assert that the singleton will be created only once. You can + * change this by redefining NM_DEFINE_SINGLETON_ALLOW_MULTIPLE. */ +#ifndef NM_DEFINE_SINGLETON_ALLOW_MULTIPLE +#define NM_DEFINE_SINGLETON_ALLOW_MULTIPLE FALSE +#endif + +#define NM_DEFINE_SINGLETON_GETTER(TYPE, GETTER, GTYPE, ...) \ +NM_DEFINE_SINGLETON_INSTANCE (TYPE); \ +NM_DEFINE_SINGLETON_WEAK_REF (TYPE); \ +TYPE * \ +GETTER (void) \ +{ \ + if (G_UNLIKELY (!singleton_instance)) { \ + static char _already_created = FALSE; \ +\ + g_assert (!_already_created || (NM_DEFINE_SINGLETON_ALLOW_MULTIPLE)); \ + _already_created = TRUE;\ + singleton_instance = (g_object_new (GTYPE, ##__VA_ARGS__, NULL)); \ + g_assert (singleton_instance); \ + nm_singleton_instance_weak_ref_register (); \ + nm_log_dbg (LOGD_CORE, "create %s singleton (%p)", G_STRINGIFY (TYPE), singleton_instance); \ + } \ + return singleton_instance; \ +} \ +NM_DEFINE_SINGLETON_DESTRUCTOR(TYPE) + +/*****************************************************************************/ + #endif From 822cb293ef26ead5afd2e60d63d76d3df4f09f3d Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 5 Jan 2015 18:26:26 +0100 Subject: [PATCH 02/14] core/trivial: rename singleton variables according to default name --- src/nm-auth-manager.c | 16 ++++++++-------- src/nm-dbus-manager.c | 12 ++++++------ src/nm-default-route-manager.c | 12 ++++++------ src/settings/nm-inotify-helper.c | 16 ++++++++-------- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/nm-auth-manager.c b/src/nm-auth-manager.c index fc8f8cda10..2b929f6756 100644 --- a/src/nm-auth-manager.c +++ b/src/nm-auth-manager.c @@ -37,7 +37,7 @@ if (nm_logging_enabled ((level), (domain))) { \ char __prefix[30] = "auth"; \ \ - if ((self) != _instance) \ + if ((self) != singleton_instance) \ g_snprintf (__prefix, sizeof (__prefix), "auth[%p]", (self)); \ nm_log ((level), (domain), \ "%s: " _NM_UTILS_MACRO_FIRST(__VA_ARGS__), \ @@ -76,7 +76,7 @@ typedef struct { #endif } NMAuthManagerPrivate; -static NMAuthManager *_instance = NULL; +static NMAuthManager *singleton_instance = NULL; G_DEFINE_TYPE (NMAuthManager, nm_auth_manager, G_TYPE_OBJECT) @@ -485,9 +485,9 @@ _dbus_new_proxy_cb (GObject *source_object, NMAuthManager * nm_auth_manager_get () { - g_return_val_if_fail (_instance, NULL); + g_return_val_if_fail (singleton_instance, NULL); - return _instance; + return singleton_instance; } NMAuthManager * @@ -495,14 +495,14 @@ nm_auth_manager_setup (gboolean polkit_enabled) { NMAuthManager *self; - g_return_val_if_fail (!_instance, _instance); + g_return_val_if_fail (!singleton_instance, singleton_instance); self = g_object_new (NM_TYPE_AUTH_MANAGER, NM_AUTH_MANAGER_POLKIT_ENABLED, polkit_enabled, NULL); _LOGD ("set instance"); - return (_instance = self); + return (singleton_instance = self); } /*****************************************************************************/ @@ -616,8 +616,8 @@ finalize (GObject *object) G_OBJECT_CLASS (nm_auth_manager_parent_class)->finalize (object); - if (self == _instance) { - _instance = NULL; + if (self == singleton_instance) { + singleton_instance = NULL; _LOGD ("unset instance"); } } diff --git a/src/nm-dbus-manager.c b/src/nm-dbus-manager.c index 8923da02e4..9ba0ec963c 100644 --- a/src/nm-dbus-manager.c +++ b/src/nm-dbus-manager.c @@ -81,17 +81,17 @@ static void object_destroyed (NMDBusManager *self, gpointer object); NMDBusManager * nm_dbus_manager_get (void) { - static NMDBusManager *singleton = NULL; + static NMDBusManager *singleton_instance = 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); + singleton_instance = (NMDBusManager *) g_object_new (NM_TYPE_DBUS_MANAGER, NULL); + g_assert (singleton_instance); + if (!nm_dbus_manager_init_bus (singleton_instance)) + start_reconnection_timeout (singleton_instance); g_once_init_leave (&once, 1); } - return singleton; + return singleton_instance; } /**************************************************************/ diff --git a/src/nm-default-route-manager.c b/src/nm-default-route-manager.c index 5cc1bcd2b5..5ad5301a95 100644 --- a/src/nm-default-route-manager.c +++ b/src/nm-default-route-manager.c @@ -50,7 +50,7 @@ typedef struct { G_DEFINE_TYPE (NMDefaultRouteManager, nm_default_route_manager, G_TYPE_OBJECT) -static NMDefaultRouteManager *_instance; +static NMDefaultRouteManager *singleton_instance; #define _LOG(level, addr_family, ...) \ G_STMT_START { \ @@ -61,7 +61,7 @@ static NMDefaultRouteManager *_instance; char __ch = __addr_family == AF_INET ? '4' : (__addr_family == AF_INET6 ? '6' : '-'); \ char __prefix[30] = "default-route"; \ \ - if ((self) != _instance) \ + if ((self) != singleton_instance) \ g_snprintf (__prefix, sizeof (__prefix), "default-route%c[%p]", __ch, (self)); \ else \ __prefix[STRLEN ("default-route")] = __ch; \ @@ -1157,11 +1157,11 @@ static const VTableIP vtable_ip6 = { NMDefaultRouteManager * nm_default_route_manager_get () { - if (G_UNLIKELY (!_instance)) { - _instance = NM_DEFAULT_ROUTE_MANAGER (g_object_new (NM_TYPE_DEFAULT_ROUTE_MANAGER, NULL)); - g_object_add_weak_pointer (G_OBJECT (_instance), (gpointer *) &_instance); + if (G_UNLIKELY (!singleton_instance)) { + singleton_instance = NM_DEFAULT_ROUTE_MANAGER (g_object_new (NM_TYPE_DEFAULT_ROUTE_MANAGER, NULL)); + g_object_add_weak_pointer (G_OBJECT (singleton_instance), (gpointer *) &singleton_instance); } - return _instance; + return singleton_instance; } /***********************************************************************************/ diff --git a/src/settings/nm-inotify-helper.c b/src/settings/nm-inotify-helper.c index 85b3c4000b..41f0268d1c 100644 --- a/src/settings/nm-inotify-helper.c +++ b/src/settings/nm-inotify-helper.c @@ -148,20 +148,20 @@ init_inotify (NMInotifyHelper *self) NMInotifyHelper * nm_inotify_helper_get (void) { - static NMInotifyHelper *singleton = NULL; + static NMInotifyHelper *singleton_instance = NULL; - if (!singleton) { - singleton = (NMInotifyHelper *) g_object_new (NM_TYPE_INOTIFY_HELPER, NULL); + if (!singleton_instance) { + singleton_instance = (NMInotifyHelper *) g_object_new (NM_TYPE_INOTIFY_HELPER, NULL); - if (!init_inotify (singleton)) { - g_clear_object (&singleton); + if (!init_inotify (singleton_instance)) { + g_clear_object (&singleton_instance); return NULL; } } else - g_object_ref (singleton); + g_object_ref (singleton_instance); - g_assert (singleton); - return singleton; + g_assert (singleton_instance); + return singleton_instance; } static void From a8ebd1aa1ab9284a356b3ff04791ee6b11e67f33 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 5 Jan 2015 16:37:45 +0100 Subject: [PATCH 03/14] core: declare nm_sleep_monitor_get() using NM_DEFINE_SINGLETON_GETTER() Also no longer increment the reference count in the getter and properly disconnect the signals in NMManager:dispose(). Also use the defines for the signal names instead of plain strings. --- src/nm-manager.c | 12 ++++++++---- src/nm-sleep-monitor-systemd.c | 12 +----------- src/nm-sleep-monitor-upower.c | 12 +----------- 3 files changed, 10 insertions(+), 26 deletions(-) diff --git a/src/nm-manager.c b/src/nm-manager.c index f1c355281e..34105ae9b0 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -4852,10 +4852,10 @@ nm_manager_init (NMManager *manager) nm_log_warn (LOGD_AUTOIP4, "could not initialize avahi-autoipd D-Bus proxy"); /* sleep/wake handling */ - priv->sleep_monitor = nm_sleep_monitor_get (); - g_signal_connect (priv->sleep_monitor, "sleeping", + priv->sleep_monitor = g_object_ref (nm_sleep_monitor_get ()); + g_signal_connect (priv->sleep_monitor, NM_SLEEP_MONITOR_SLEEPING, G_CALLBACK (sleeping_cb), manager); - g_signal_connect (priv->sleep_monitor, "resuming", + g_signal_connect (priv->sleep_monitor, NM_SLEEP_MONITOR_RESUMING, G_CALLBACK (resuming_cb), manager); /* Listen for authorization changes */ @@ -5065,7 +5065,11 @@ dispose (GObject *object) } g_clear_object (&priv->aipd_proxy); - g_clear_object (&priv->sleep_monitor); + if (priv->sleep_monitor) { + g_signal_handlers_disconnect_by_func (priv->sleep_monitor, sleeping_cb, manager); + g_signal_handlers_disconnect_by_func (priv->sleep_monitor, resuming_cb, manager); + g_clear_object (&priv->sleep_monitor); + } if (priv->fw_monitor) { g_signal_handlers_disconnect_by_func (priv->fw_monitor, firmware_dir_changed, manager); diff --git a/src/nm-sleep-monitor-systemd.c b/src/nm-sleep-monitor-systemd.c index c0bc65e4a6..44523a4a21 100644 --- a/src/nm-sleep-monitor-systemd.c +++ b/src/nm-sleep-monitor-systemd.c @@ -243,16 +243,6 @@ nm_sleep_monitor_class_init (NMSleepMonitorClass *klass) G_TYPE_NONE, 0); } -NMSleepMonitor * -nm_sleep_monitor_get (void) -{ - static NMSleepMonitor *singleton = NULL; - - if (singleton) - return g_object_ref (singleton); - - singleton = NM_SLEEP_MONITOR (g_object_new (NM_TYPE_SLEEP_MONITOR, NULL)); - return singleton; -} +NM_DEFINE_SINGLETON_GETTER (NMSleepMonitor, nm_sleep_monitor_get, NM_TYPE_SLEEP_MONITOR); /* ---------------------------------------------------------------------------------------------------- */ diff --git a/src/nm-sleep-monitor-upower.c b/src/nm-sleep-monitor-upower.c index 39cce5958d..0c46ae10fc 100644 --- a/src/nm-sleep-monitor-upower.c +++ b/src/nm-sleep-monitor-upower.c @@ -133,16 +133,6 @@ nm_sleep_monitor_class_init (NMSleepMonitorClass *klass) G_TYPE_NONE, 0); } -NMSleepMonitor * -nm_sleep_monitor_get (void) -{ - static NMSleepMonitor *singleton = NULL; - - if (singleton) - return g_object_ref (singleton); - - singleton = NM_SLEEP_MONITOR (g_object_new (NM_TYPE_SLEEP_MONITOR, NULL)); - return singleton; -} +NM_DEFINE_SINGLETON_GETTER (NMSleepMonitor, nm_sleep_monitor_get, NM_TYPE_SLEEP_MONITOR); /* ---------------------------------------------------------------------------------------------------- */ From e439637adac69c5ed89a3217fadacf21c96b94bf Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 5 Jan 2015 17:20:23 +0100 Subject: [PATCH 04/14] core: declare nm_dns_manager_get() using NM_DEFINE_SINGLETON_GETTER() --- src/dns-manager/nm-dns-manager.c | 13 +------------ src/main.c | 5 ----- src/nm-policy.c | 4 ++-- 3 files changed, 3 insertions(+), 19 deletions(-) diff --git a/src/dns-manager/nm-dns-manager.c b/src/dns-manager/nm-dns-manager.c index 9af921bedf..39ef99bda5 100644 --- a/src/dns-manager/nm-dns-manager.c +++ b/src/dns-manager/nm-dns-manager.c @@ -1080,18 +1080,7 @@ nm_dns_manager_end_updates (NMDnsManager *mgr, const char *func) /******************************************************************/ -NMDnsManager * -nm_dns_manager_get (void) -{ - static NMDnsManager * singleton = NULL; - - if (!singleton) { - singleton = NM_DNS_MANAGER (g_object_new (NM_TYPE_DNS_MANAGER, NULL)); - g_assert (singleton); - } - - return singleton; -} +NM_DEFINE_SINGLETON_GETTER (NMDnsManager, nm_dns_manager_get, NM_TYPE_DNS_MANAGER); static void init_resolv_conf_mode (NMDnsManager *self) diff --git a/src/main.c b/src/main.c index f91d579d80..5f80bcd1b3 100644 --- a/src/main.c +++ b/src/main.c @@ -46,7 +46,6 @@ #include "main-utils.h" #include "nm-manager.h" #include "nm-linux-platform.h" -#include "nm-dns-manager.h" #include "nm-dbus-manager.h" #include "nm-supplicant-manager.h" #include "nm-dhcp-manager.h" @@ -204,7 +203,6 @@ main (int argc, char *argv[]) gboolean success, show_version = FALSE; NMManager *manager = NULL; gs_unref_object NMVpnManager *vpn_manager = NULL; - gs_unref_object NMDnsManager *dns_mgr = NULL; gs_unref_object NMDBusManager *dbus_mgr = NULL; gs_unref_object NMSupplicantManager *sup_mgr = NULL; gs_unref_object NMDhcpManager *dhcp_mgr = NULL; @@ -402,9 +400,6 @@ main (int argc, char *argv[]) vpn_manager = nm_vpn_manager_get (); g_assert (vpn_manager != NULL); - dns_mgr = nm_dns_manager_get (); - g_assert (dns_mgr != NULL); - /* Initialize DHCP manager */ dhcp_mgr = nm_dhcp_manager_get (); g_assert (dhcp_mgr != NULL); diff --git a/src/nm-policy.c b/src/nm-policy.c index 87fcdcc925..d995421a33 100644 --- a/src/nm-policy.c +++ b/src/nm-policy.c @@ -1788,7 +1788,7 @@ nm_policy_new (NMManager *manager, NMSettings *settings) priv->fw_started_id = g_signal_connect (nm_firewall_manager_get (), "started", G_CALLBACK (firewall_started), policy); - priv->dns_manager = nm_dns_manager_get (); + priv->dns_manager = g_object_ref (nm_dns_manager_get ()); nm_dns_manager_set_initial_hostname (priv->dns_manager, priv->orig_hostname); priv->config_changed_id = g_signal_connect (priv->dns_manager, "config-changed", G_CALLBACK (dns_config_changed), policy); @@ -1899,7 +1899,7 @@ dispose (GObject *object) if (priv->dns_manager) { g_signal_handler_disconnect (priv->dns_manager, priv->config_changed_id); - priv->dns_manager = NULL; + g_clear_object (&priv->dns_manager); } for (iter = priv->manager_ids; iter; iter = g_slist_next (iter)) From fc575d678302e079ce6122697e4d7c8824335fe5 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 5 Jan 2015 19:30:00 +0100 Subject: [PATCH 05/14] core: declare nm_dhcp_manager_get() using NM_DEFINE_SINGLETON_GETTER() --- src/dhcp-manager/nm-dhcp-manager.c | 11 +---------- src/main.c | 5 ----- src/nm-iface-helper.c | 7 +------ 3 files changed, 2 insertions(+), 21 deletions(-) diff --git a/src/dhcp-manager/nm-dhcp-manager.c b/src/dhcp-manager/nm-dhcp-manager.c index f936f45c58..c547af10cd 100644 --- a/src/dhcp-manager/nm-dhcp-manager.c +++ b/src/dhcp-manager/nm-dhcp-manager.c @@ -371,16 +371,7 @@ nm_dhcp_manager_get_lease_ip_configs (NMDhcpManager *self, /***************************************************/ -NMDhcpManager * -nm_dhcp_manager_get (void) -{ - static NMDhcpManager *singleton = NULL; - - if (G_UNLIKELY (singleton == NULL)) - singleton = g_object_new (NM_TYPE_DHCP_MANAGER, NULL); - g_assert (singleton); - return singleton; -} +NM_DEFINE_SINGLETON_GETTER (NMDhcpManager, nm_dhcp_manager_get, NM_TYPE_DHCP_MANAGER); static void nm_dhcp_manager_init (NMDhcpManager *self) diff --git a/src/main.c b/src/main.c index 5f80bcd1b3..ba1de09a7b 100644 --- a/src/main.c +++ b/src/main.c @@ -205,7 +205,6 @@ main (int argc, char *argv[]) gs_unref_object NMVpnManager *vpn_manager = NULL; gs_unref_object NMDBusManager *dbus_mgr = NULL; gs_unref_object NMSupplicantManager *sup_mgr = NULL; - gs_unref_object NMDhcpManager *dhcp_mgr = NULL; gs_unref_object NMFirewallManager *fw_mgr = NULL; gs_unref_object NMSettings *settings = NULL; gs_unref_object NMConfig *config = NULL; @@ -400,10 +399,6 @@ main (int argc, char *argv[]) vpn_manager = nm_vpn_manager_get (); g_assert (vpn_manager != NULL); - /* Initialize DHCP manager */ - dhcp_mgr = nm_dhcp_manager_get (); - g_assert (dhcp_mgr != NULL); - nm_dispatcher_init (); settings = nm_settings_new (&error); diff --git a/src/nm-iface-helper.c b/src/nm-iface-helper.c index 9d5cdc05cf..910c804711 100644 --- a/src/nm-iface-helper.c +++ b/src/nm-iface-helper.c @@ -277,7 +277,6 @@ main (int argc, char *argv[]) gboolean show_version = FALSE, slaac = FALSE; char *bad_domains = NULL, *dhcp4_hostname = NULL, *uuid = NULL; char *iid_str = NULL, *dhcp4_clientid = NULL, *dhcp4_address = NULL; - gs_unref_object NMDhcpManager *dhcp_mgr = NULL; GError *error = NULL; gboolean wrote_pidfile = FALSE; gs_free char *pidfile = NULL; @@ -430,11 +429,7 @@ main (int argc, char *argv[]) if (dhcp4_address) { nm_platform_sysctl_set (nm_utils_ip4_property_path (ifname, "promote_secondaries"), "1"); - /* Initialize DHCP manager */ - dhcp_mgr = nm_dhcp_manager_get (); - g_assert (dhcp_mgr != NULL); - - dhcp4_client = nm_dhcp_manager_start_ip4 (dhcp_mgr, + dhcp4_client = nm_dhcp_manager_start_ip4 (nm_dhcp_manager_get (), ifname, ifindex, hwaddr, From e2739cfc1b635363bf442be84a45b333afde81b1 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 5 Jan 2015 19:32:36 +0100 Subject: [PATCH 06/14] core: declare nm_vpn_manager_get() using NM_DEFINE_SINGLETON_GETTER() --- src/main.c | 5 ----- src/nm-manager.c | 2 +- src/vpn-manager/nm-vpn-manager.c | 14 +------------- 3 files changed, 2 insertions(+), 19 deletions(-) diff --git a/src/main.c b/src/main.c index ba1de09a7b..2754e73c17 100644 --- a/src/main.c +++ b/src/main.c @@ -50,7 +50,6 @@ #include "nm-supplicant-manager.h" #include "nm-dhcp-manager.h" #include "nm-firewall-manager.h" -#include "nm-vpn-manager.h" #include "nm-logging.h" #include "nm-config.h" #include "nm-posix-signals.h" @@ -202,7 +201,6 @@ main (int argc, char *argv[]) gboolean wifi_enabled = TRUE, net_enabled = TRUE, wwan_enabled = TRUE, wimax_enabled = TRUE; gboolean success, show_version = FALSE; NMManager *manager = NULL; - gs_unref_object NMVpnManager *vpn_manager = NULL; gs_unref_object NMDBusManager *dbus_mgr = NULL; gs_unref_object NMSupplicantManager *sup_mgr = NULL; gs_unref_object NMFirewallManager *fw_mgr = NULL; @@ -396,9 +394,6 @@ main (int argc, char *argv[]) dbus_mgr = nm_dbus_manager_get (); g_assert (dbus_mgr != NULL); - vpn_manager = nm_vpn_manager_get (); - g_assert (vpn_manager != NULL); - nm_dispatcher_init (); settings = nm_settings_new (&error); diff --git a/src/nm-manager.c b/src/nm-manager.c index 34105ae9b0..f3c508180a 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -4824,7 +4824,7 @@ nm_manager_init (NMManager *manager) G_CALLBACK (dbus_connection_changed_cb), manager); - priv->vpn_manager = nm_vpn_manager_get (); + priv->vpn_manager = g_object_ref (nm_vpn_manager_get ()); g_connection = nm_dbus_manager_get_connection (priv->dbus_mgr); diff --git a/src/vpn-manager/nm-vpn-manager.c b/src/vpn-manager/nm-vpn-manager.c index 1f3798c7fc..1de9b753f3 100644 --- a/src/vpn-manager/nm-vpn-manager.c +++ b/src/vpn-manager/nm-vpn-manager.c @@ -200,19 +200,7 @@ vpn_dir_changed (GFileMonitor *monitor, /******************************************************************************/ -NMVpnManager * -nm_vpn_manager_get (void) -{ - static NMVpnManager *singleton = NULL; - - if (!singleton) - singleton = NM_VPN_MANAGER (g_object_new (NM_TYPE_VPN_MANAGER, NULL)); - else - g_object_ref (singleton); - - g_assert (singleton); - return singleton; -} +NM_DEFINE_SINGLETON_GETTER (NMVpnManager, nm_vpn_manager_get, NM_TYPE_VPN_MANAGER); static void nm_vpn_manager_init (NMVpnManager *self) From f4bf50bf4a19797df6db4f91813ea06fce9fbc02 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 5 Jan 2015 19:39:56 +0100 Subject: [PATCH 07/14] core: declare nm_inotify_helper_get() using NM_DEFINE_SINGLETON_GETTER() Refactor NMInotifyHelper to implement the singleton getter using NM_DEFINE_SINGLETON_GETTER(). For one this means that the getter no longer increments the reference count. This was anyway wrong, because no caller of nm_inotify_helper_get() unrefered the returned reference, hence leaking the singleton. Also, the getter can no longer fail to create the singleton instance. Note that none of the callers actually coped with a failure to get the singleton. Instead return an instance that does nothing. One downside (upside?) of this is that we only try once to initialize the inotify handle. --- src/settings/nm-inotify-helper.c | 43 +++++++++++++++----------------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/src/settings/nm-inotify-helper.c b/src/settings/nm-inotify-helper.c index 41f0268d1c..3732e77a39 100644 --- a/src/settings/nm-inotify-helper.c +++ b/src/settings/nm-inotify-helper.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "nm-inotify-helper.h" #include "nm-logging.h" @@ -55,9 +56,10 @@ nm_inotify_helper_add_watch (NMInotifyHelper *self, const char *path) { NMInotifyHelperPrivate *priv = NM_INOTIFY_HELPER_GET_PRIVATE (self); int wd; - guint32 refcount; + guint refcount; - g_return_val_if_fail (priv->ifd >= 0, -1); + if (priv->ifd < 0) + return -1; /* We only care about modifications since we're just trying to get change * notifications on hardlinks. @@ -78,9 +80,10 @@ void nm_inotify_helper_remove_watch (NMInotifyHelper *self, int wd) { NMInotifyHelperPrivate *priv = NM_INOTIFY_HELPER_GET_PRIVATE (self); - guint32 refcount; + guint refcount; - g_return_if_fail (priv->ifd >= 0); + if (priv->ifd < 0) + return; refcount = GPOINTER_TO_UINT (g_hash_table_lookup (priv->wd_refs, GINT_TO_POINTER (wd))); if (!refcount) @@ -128,7 +131,9 @@ init_inotify (NMInotifyHelper *self) priv->ifd = inotify_init (); if (priv->ifd == -1) { - nm_log_warn (LOGD_SETTINGS, "couldn't initialize inotify"); + int errsv = errno; + + nm_log_warn (LOGD_SETTINGS, "couldn't initialize inotify: %s (%d)", strerror (errsv), errsv); return FALSE; } @@ -145,24 +150,7 @@ init_inotify (NMInotifyHelper *self) return TRUE; } -NMInotifyHelper * -nm_inotify_helper_get (void) -{ - static NMInotifyHelper *singleton_instance = NULL; - - if (!singleton_instance) { - singleton_instance = (NMInotifyHelper *) g_object_new (NM_TYPE_INOTIFY_HELPER, NULL); - - if (!init_inotify (singleton_instance)) { - g_clear_object (&singleton_instance); - return NULL; - } - } else - g_object_ref (singleton_instance); - - g_assert (singleton_instance); - return singleton_instance; -} +NM_DEFINE_SINGLETON_GETTER (NMInotifyHelper, nm_inotify_helper_get, NM_TYPE_INOTIFY_HELPER); static void nm_inotify_helper_init (NMInotifyHelper *self) @@ -172,6 +160,14 @@ nm_inotify_helper_init (NMInotifyHelper *self) priv->wd_refs = g_hash_table_new (g_direct_hash, g_direct_equal); } +static void +constructed (GObject *object) +{ + G_OBJECT_CLASS (nm_inotify_helper_parent_class)->constructed (object); + + init_inotify (NM_INOTIFY_HELPER (object)); +} + static void finalize (GObject *object) { @@ -193,6 +189,7 @@ nm_inotify_helper_class_init (NMInotifyHelperClass *klass) g_type_class_add_private (klass, sizeof (NMInotifyHelperPrivate)); /* Virtual methods */ + object_class->constructed = constructed; object_class->finalize = finalize; /* Signals */ From 22409e0481dcaf5a288ad73553cbef5e2da05207 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 6 Jan 2015 11:45:14 +0100 Subject: [PATCH 08/14] core: declare nm_firewall_manager_get() using NM_DEFINE_SINGLETON_GETTER() --- src/main.c | 6 ------ src/nm-firewall-manager.c | 13 +------------ 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/src/main.c b/src/main.c index 2754e73c17..5a2934bd7b 100644 --- a/src/main.c +++ b/src/main.c @@ -49,7 +49,6 @@ #include "nm-dbus-manager.h" #include "nm-supplicant-manager.h" #include "nm-dhcp-manager.h" -#include "nm-firewall-manager.h" #include "nm-logging.h" #include "nm-config.h" #include "nm-posix-signals.h" @@ -203,7 +202,6 @@ main (int argc, char *argv[]) NMManager *manager = NULL; gs_unref_object NMDBusManager *dbus_mgr = NULL; gs_unref_object NMSupplicantManager *sup_mgr = NULL; - gs_unref_object NMFirewallManager *fw_mgr = NULL; gs_unref_object NMSettings *settings = NULL; gs_unref_object NMConfig *config = NULL; GError *error = NULL; @@ -420,10 +418,6 @@ main (int argc, char *argv[]) sup_mgr = nm_supplicant_manager_get (); g_assert (sup_mgr != NULL); - /* Initialize Firewall manager */ - fw_mgr = nm_firewall_manager_get (); - g_assert (fw_mgr != NULL); - if (!nm_dbus_manager_get_connection (dbus_mgr)) { #if HAVE_DBUS_GLIB_100 nm_log_warn (LOGD_CORE, "Failed to connect to D-Bus; only private bus is available"); diff --git a/src/nm-firewall-manager.c b/src/nm-firewall-manager.c index 59520b3b44..4d302e9d2f 100644 --- a/src/nm-firewall-manager.c +++ b/src/nm-firewall-manager.c @@ -337,18 +337,7 @@ name_owner_changed (NMDBusManager *dbus_mgr, /*******************************************************************/ -NMFirewallManager * -nm_firewall_manager_get (void) -{ - static NMFirewallManager *singleton = NULL; - - if (G_UNLIKELY (!singleton)) { - singleton = NM_FIREWALL_MANAGER (g_object_new (NM_TYPE_FIREWALL_MANAGER, NULL)); - g_assert (singleton); - } - - return singleton; -} +NM_DEFINE_SINGLETON_GETTER (NMFirewallManager, nm_firewall_manager_get, NM_TYPE_FIREWALL_MANAGER); static void nm_firewall_manager_init (NMFirewallManager * self) From d8887019ce43e29c050f51ae9656b37bd3b262ad Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 6 Jan 2015 11:50:41 +0100 Subject: [PATCH 09/14] core: declare nm_session_monitor_get() using NM_DEFINE_SINGLETON_GETTER() --- src/nm-session-monitor.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/nm-session-monitor.c b/src/nm-session-monitor.c index 691b3a724c..050dae0e79 100644 --- a/src/nm-session-monitor.c +++ b/src/nm-session-monitor.c @@ -278,16 +278,9 @@ ck_finalize (NMSessionMonitor *monitor) /********************************************************************/ -static NMSessionMonitor * -nm_session_monitor_get (void) -{ - static NMSessionMonitor *singleton = NULL; +NMSessionMonitor *nm_session_monitor_get(void); - if (!singleton) - singleton = NM_SESSION_MONITOR (g_object_new (NM_TYPE_SESSION_MONITOR, NULL)); - - return singleton; -} +NM_DEFINE_SINGLETON_GETTER (NMSessionMonitor, nm_session_monitor_get, NM_TYPE_SESSION_MONITOR); /** * nm_session_monitor_connect: From d45c1b84f433da696a1c244fb6d65a26a3e26661 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 6 Jan 2015 11:54:27 +0100 Subject: [PATCH 10/14] core: declare nm_supplicant_manager_get() using NM_DEFINE_SINGLETON_GETTER() --- src/devices/nm-device-ethernet.c | 2 +- src/devices/wifi/nm-device-wifi.c | 3 +-- src/main.c | 7 +------ src/supplicant-manager/nm-supplicant-manager.c | 14 +------------- 4 files changed, 4 insertions(+), 22 deletions(-) diff --git a/src/devices/nm-device-ethernet.c b/src/devices/nm-device-ethernet.c index ac408d3d9f..0027958c38 100644 --- a/src/devices/nm-device-ethernet.c +++ b/src/devices/nm-device-ethernet.c @@ -946,7 +946,7 @@ nm_8021x_stage2_config (NMDeviceEthernet *self, NMDeviceStateReason *reason) } if (!priv->supplicant.mgr) - priv->supplicant.mgr = nm_supplicant_manager_get (); + priv->supplicant.mgr = g_object_ref (nm_supplicant_manager_get ()); /* If we need secrets, get them */ setting_name = nm_connection_need_secrets (connection, NULL); diff --git a/src/devices/wifi/nm-device-wifi.c b/src/devices/wifi/nm-device-wifi.c index dd7754b33e..7d3dc9a1d7 100644 --- a/src/devices/wifi/nm-device-wifi.c +++ b/src/devices/wifi/nm-device-wifi.c @@ -224,8 +224,7 @@ constructor (GType type, _LOGI (LOGD_HW | LOGD_WIFI, "driver supports Access Point (AP) mode"); /* Connect to the supplicant manager */ - priv->sup_mgr = nm_supplicant_manager_get (); - g_assert (priv->sup_mgr); + priv->sup_mgr = g_object_ref (nm_supplicant_manager_get ()); return object; } diff --git a/src/main.c b/src/main.c index 5a2934bd7b..88d16144d9 100644 --- a/src/main.c +++ b/src/main.c @@ -47,7 +47,7 @@ #include "nm-manager.h" #include "nm-linux-platform.h" #include "nm-dbus-manager.h" -#include "nm-supplicant-manager.h" +#include "nm-device.h" #include "nm-dhcp-manager.h" #include "nm-logging.h" #include "nm-config.h" @@ -201,7 +201,6 @@ main (int argc, char *argv[]) gboolean success, show_version = FALSE; NMManager *manager = NULL; gs_unref_object NMDBusManager *dbus_mgr = NULL; - gs_unref_object NMSupplicantManager *sup_mgr = NULL; gs_unref_object NMSettings *settings = NULL; gs_unref_object NMConfig *config = NULL; GError *error = NULL; @@ -414,10 +413,6 @@ main (int argc, char *argv[]) goto done; } - /* Initialize the supplicant manager */ - sup_mgr = nm_supplicant_manager_get (); - g_assert (sup_mgr != NULL); - if (!nm_dbus_manager_get_connection (dbus_mgr)) { #if HAVE_DBUS_GLIB_100 nm_log_warn (LOGD_CORE, "Failed to connect to D-Bus; only private bus is available"); diff --git a/src/supplicant-manager/nm-supplicant-manager.c b/src/supplicant-manager/nm-supplicant-manager.c index 01e35929d4..9a7a69844b 100644 --- a/src/supplicant-manager/nm-supplicant-manager.c +++ b/src/supplicant-manager/nm-supplicant-manager.c @@ -301,19 +301,7 @@ name_owner_changed (NMDBusManager *dbus_mgr, /*******************************************************************/ -NMSupplicantManager * -nm_supplicant_manager_get (void) -{ - static NMSupplicantManager *singleton = NULL; - - if (!singleton) - singleton = NM_SUPPLICANT_MANAGER (g_object_new (NM_TYPE_SUPPLICANT_MANAGER, NULL)); - else - g_object_ref (singleton); - - g_assert (singleton); - return singleton; -} +NM_DEFINE_SINGLETON_GETTER (NMSupplicantManager, nm_supplicant_manager_get, NM_TYPE_SUPPLICANT_MANAGER); static void nm_supplicant_manager_init (NMSupplicantManager *self) From 3af40acf31e458d407805fcfc6ef7160b966c045 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 6 Jan 2015 12:11:21 +0100 Subject: [PATCH 11/14] core: declare nm_agent_manager_get() using NM_DEFINE_SINGLETON_GETTER() Also move the initilization of the instance into the constructed() method. NMAgentManager now owns a reference to the DBUS manager and Auth manager and the dispose() function properly unregisters itself from both. --- src/settings/nm-agent-manager.c | 88 ++++++++++++++------------- src/settings/nm-settings-connection.c | 2 +- src/settings/nm-settings.c | 2 +- src/vpn-manager/nm-vpn-connection.c | 5 +- 4 files changed, 50 insertions(+), 47 deletions(-) diff --git a/src/settings/nm-agent-manager.c b/src/settings/nm-agent-manager.c index 8ebb690f9c..017624171d 100644 --- a/src/settings/nm-agent-manager.c +++ b/src/settings/nm-agent-manager.c @@ -50,9 +50,8 @@ G_DEFINE_TYPE (NMAgentManager, nm_agent_manager, G_TYPE_OBJECT) NMAgentManagerPrivate)) typedef struct { - gboolean disposed; - NMDBusManager *dbus_mgr; + NMAuthManager *auth_mgr; /* Auth chains for checking agent permissions */ GSList *chains; @@ -1537,35 +1536,7 @@ authority_changed_cb (NMAuthManager *auth_manager, NMAgentManager *self) /*************************************************************/ -NMAgentManager * -nm_agent_manager_get (void) -{ - static NMAgentManager *singleton = NULL; - NMAgentManagerPrivate *priv; - - if (singleton) - return g_object_ref (singleton); - - singleton = (NMAgentManager *) g_object_new (NM_TYPE_AGENT_MANAGER, NULL); - g_assert (singleton); - - priv = NM_AGENT_MANAGER_GET_PRIVATE (singleton); - priv->dbus_mgr = nm_dbus_manager_get (); - - 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, - G_CALLBACK (name_owner_changed_cb), - singleton); - - g_signal_connect (nm_auth_manager_get (), - NM_AUTH_MANAGER_SIGNAL_CHANGED, - G_CALLBACK (authority_changed_cb), - singleton); - - return singleton; -} +NM_DEFINE_SINGLETON_GETTER (NMAgentManager, nm_agent_manager_get, NM_TYPE_AGENT_MANAGER); static void nm_agent_manager_init (NMAgentManager *self) @@ -1579,24 +1550,58 @@ nm_agent_manager_init (NMAgentManager *self) (GDestroyNotify) request_free); } +static void +constructed (GObject *object) +{ + NMAgentManagerPrivate *priv = NM_AGENT_MANAGER_GET_PRIVATE (object); + + G_OBJECT_CLASS (nm_agent_manager_parent_class)->constructed (object); + + priv->dbus_mgr = g_object_ref (nm_dbus_manager_get ()); + priv->auth_mgr = g_object_ref (nm_auth_manager_get ()); + + nm_dbus_manager_register_object (priv->dbus_mgr, NM_DBUS_PATH_AGENT_MANAGER, object); + + g_signal_connect (priv->dbus_mgr, + NM_DBUS_MANAGER_NAME_OWNER_CHANGED, + G_CALLBACK (name_owner_changed_cb), + object); + + g_signal_connect (priv->auth_mgr, + NM_AUTH_MANAGER_SIGNAL_CHANGED, + G_CALLBACK (authority_changed_cb), + object); +} + static void dispose (GObject *object) { NMAgentManagerPrivate *priv = NM_AGENT_MANAGER_GET_PRIVATE (object); - if (!priv->disposed) { - priv->disposed = TRUE; + g_slist_free_full (priv->chains, (GDestroyNotify) nm_auth_chain_unref); + priv->chains = NULL; - g_signal_handlers_disconnect_by_func (nm_auth_manager_get (), + if (priv->agents) { + g_hash_table_destroy (priv->agents); + priv->agents = NULL; + } + if (priv->requests) { + g_hash_table_destroy (priv->requests); + priv->requests = NULL; + } + + if (priv->auth_mgr) { + g_signal_handlers_disconnect_by_func (priv->auth_mgr, G_CALLBACK (authority_changed_cb), object); - - g_slist_free_full (priv->chains, (GDestroyNotify) nm_auth_chain_unref); - - g_hash_table_destroy (priv->agents); - g_hash_table_destroy (priv->requests); - - priv->dbus_mgr = NULL; + g_clear_object (&priv->auth_mgr); + } + if (priv->dbus_mgr) { + g_signal_handlers_disconnect_by_func (priv->dbus_mgr, + G_CALLBACK (name_owner_changed_cb), + object); + nm_dbus_manager_unregister_object (priv->dbus_mgr, object); + g_clear_object (&priv->dbus_mgr); } G_OBJECT_CLASS (nm_agent_manager_parent_class)->dispose (object); @@ -1610,6 +1615,7 @@ nm_agent_manager_class_init (NMAgentManagerClass *agent_manager_class) g_type_class_add_private (agent_manager_class, sizeof (NMAgentManagerPrivate)); /* virtual methods */ + object_class->constructed = constructed; object_class->dispose = dispose; /* Signals */ diff --git a/src/settings/nm-settings-connection.c b/src/settings/nm-settings-connection.c index 66666ee4d2..44a45bb472 100644 --- a/src/settings/nm-settings-connection.c +++ b/src/settings/nm-settings-connection.c @@ -2200,7 +2200,7 @@ nm_settings_connection_init (NMSettingsConnection *self) priv->session_changed_id = nm_session_monitor_connect (session_changed_cb, self); - priv->agent_mgr = nm_agent_manager_get (); + priv->agent_mgr = g_object_ref (nm_agent_manager_get ()); priv->seen_bssids = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); diff --git a/src/settings/nm-settings.c b/src/settings/nm-settings.c index b28c05f86f..9b99229150 100644 --- a/src/settings/nm-settings.c +++ b/src/settings/nm-settings.c @@ -1877,7 +1877,7 @@ nm_settings_init (NMSettings *self) * transient, and we don't want the agent manager to get destroyed and * recreated often. */ - priv->agent_mgr = nm_agent_manager_get (); + priv->agent_mgr = g_object_ref (nm_agent_manager_get ()); g_signal_connect (priv->agent_mgr, "agent-registered", G_CALLBACK (secret_agent_registered), self); } diff --git a/src/vpn-manager/nm-vpn-connection.c b/src/vpn-manager/nm-vpn-connection.c index cb07c7f9ad..a3c3819264 100644 --- a/src/vpn-manager/nm-vpn-connection.c +++ b/src/vpn-manager/nm-vpn-connection.c @@ -1582,7 +1582,6 @@ static void really_activate (NMVpnConnection *connection, const char *username) { NMVpnConnectionPrivate *priv; - NMAgentManager *agent_mgr; GHashTable *details; g_return_if_fail (NM_IS_VPN_CONNECTION (connection)); @@ -1621,8 +1620,7 @@ really_activate (NMVpnConnection *connection, const char *username) * dialog and we won't get the secrets we need. In this case fall back to * the old Connect() call. */ - agent_mgr = nm_agent_manager_get (); - if (nm_agent_manager_all_agents_have_capability (agent_mgr, + if (nm_agent_manager_all_agents_have_capability (nm_agent_manager_get (), nm_active_connection_get_subject (NM_ACTIVE_CONNECTION (connection)), NM_SECRET_AGENT_CAPABILITY_VPN_HINTS)) { nm_log_dbg (LOGD_VPN, "Allowing interactive secrets as all agents have that capability"); @@ -1638,7 +1636,6 @@ really_activate (NMVpnConnection *connection, const char *username) DBUS_TYPE_G_MAP_OF_MAP_OF_VARIANT, priv->connect_hash, G_TYPE_INVALID); } - g_object_unref (agent_mgr); g_hash_table_destroy (details); _set_vpn_state (connection, STATE_CONNECT, NM_VPN_CONNECTION_STATE_REASON_NONE, FALSE); From eecc440351affdb742c251c25cb30bad31bbe611 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 5 Jan 2015 19:27:07 +0100 Subject: [PATCH 12/14] core: use NM_DEFINE_SINGLETON_GETTER() macro --- src/dhcp-manager/nm-dhcp-listener.c | 11 +---------- src/nm-default-route-manager.c | 14 +------------- 2 files changed, 2 insertions(+), 23 deletions(-) diff --git a/src/dhcp-manager/nm-dhcp-listener.c b/src/dhcp-manager/nm-dhcp-listener.c index b995c3485e..bb29717a97 100644 --- a/src/dhcp-manager/nm-dhcp-listener.c +++ b/src/dhcp-manager/nm-dhcp-listener.c @@ -193,16 +193,7 @@ dis_connection_cb (NMDBusManager *mgr, /***************************************************/ -NMDhcpListener * -nm_dhcp_listener_get (void) -{ - static NMDhcpListener *singleton = NULL; - - if (G_UNLIKELY (singleton == NULL)) - singleton = g_object_new (NM_TYPE_DHCP_LISTENER, NULL); - g_assert (singleton); - return singleton; -} +NM_DEFINE_SINGLETON_GETTER (NMDhcpListener, nm_dhcp_listener_get, NM_TYPE_DHCP_LISTENER); static void nm_dhcp_listener_init (NMDhcpListener *self) diff --git a/src/nm-default-route-manager.c b/src/nm-default-route-manager.c index 5ad5301a95..c09341a5e3 100644 --- a/src/nm-default-route-manager.c +++ b/src/nm-default-route-manager.c @@ -50,7 +50,7 @@ typedef struct { G_DEFINE_TYPE (NMDefaultRouteManager, nm_default_route_manager, G_TYPE_OBJECT) -static NMDefaultRouteManager *singleton_instance; +NM_DEFINE_SINGLETON_GETTER (NMDefaultRouteManager, nm_default_route_manager_get, NM_TYPE_DEFAULT_ROUTE_MANAGER); #define _LOG(level, addr_family, ...) \ G_STMT_START { \ @@ -1154,18 +1154,6 @@ static const VTableIP vtable_ip6 = { /***********************************************************************************/ -NMDefaultRouteManager * -nm_default_route_manager_get () -{ - if (G_UNLIKELY (!singleton_instance)) { - singleton_instance = NM_DEFAULT_ROUTE_MANAGER (g_object_new (NM_TYPE_DEFAULT_ROUTE_MANAGER, NULL)); - g_object_add_weak_pointer (G_OBJECT (singleton_instance), (gpointer *) &singleton_instance); - } - return singleton_instance; -} - -/***********************************************************************************/ - static gboolean _resync_idle_now (NMDefaultRouteManager *self) { From e5a82e56980d17be7b6dc092c2eb8b062eeb6903 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 6 Jan 2015 12:22:25 +0100 Subject: [PATCH 13/14] auth: destroy singleton instance of NMAuthManager on exit --- src/nm-auth-manager.c | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/src/nm-auth-manager.c b/src/nm-auth-manager.c index 2b929f6756..c1b352c92c 100644 --- a/src/nm-auth-manager.c +++ b/src/nm-auth-manager.c @@ -76,7 +76,8 @@ typedef struct { #endif } NMAuthManagerPrivate; -static NMAuthManager *singleton_instance = NULL; +NM_DEFINE_SINGLETON_DESTRUCTOR (NMAuthManager); +NM_DEFINE_SINGLETON_WEAK_REF (NMAuthManager); G_DEFINE_TYPE (NMAuthManager, nm_auth_manager, G_TYPE_OBJECT) @@ -502,7 +503,10 @@ nm_auth_manager_setup (gboolean polkit_enabled) NULL); _LOGD ("set instance"); - return (singleton_instance = self); + singleton_instance = self; + nm_singleton_instance_weak_ref_register (); + + return self; } /*****************************************************************************/ @@ -609,19 +613,6 @@ dispose (GObject *object) G_OBJECT_CLASS (nm_auth_manager_parent_class)->dispose (object); } -static void -finalize (GObject *object) -{ - NMAuthManager* self = NM_AUTH_MANAGER (object); - - G_OBJECT_CLASS (nm_auth_manager_parent_class)->finalize (object); - - if (self == singleton_instance) { - singleton_instance = NULL; - _LOGD ("unset instance"); - } -} - static void nm_auth_manager_class_init (NMAuthManagerClass *klass) { @@ -633,7 +624,6 @@ nm_auth_manager_class_init (NMAuthManagerClass *klass) object_class->set_property = set_property; object_class->constructed = constructed; object_class->dispose = dispose; - object_class->finalize = finalize; g_object_class_install_property (object_class, PROP_POLKIT_ENABLED, From 1208c0dd13562392871d1f3fddaf17d09dc017e9 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 6 Jan 2015 13:15:43 +0100 Subject: [PATCH 14/14] dbus: destroy singleton instance of NMDBusManager on exit Don't have the singleton instance of NMDBusManager owned by the main function. Instead use NM_DEFINE_SINGLETON_DESTRUCTOR() which also logs what's happening. --- src/main.c | 9 ++------- src/nm-dbus-manager.c | 5 ++++- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main.c b/src/main.c index 88d16144d9..0901747989 100644 --- a/src/main.c +++ b/src/main.c @@ -200,7 +200,6 @@ main (int argc, char *argv[]) gboolean wifi_enabled = TRUE, net_enabled = TRUE, wwan_enabled = TRUE, wimax_enabled = TRUE; gboolean success, show_version = FALSE; NMManager *manager = NULL; - gs_unref_object NMDBusManager *dbus_mgr = NULL; gs_unref_object NMSettings *settings = NULL; gs_unref_object NMConfig *config = NULL; GError *error = NULL; @@ -387,10 +386,6 @@ main (int argc, char *argv[]) nm_auth_manager_setup (nm_config_get_auth_polkit (config)); - /* Initialize our DBus service & connection */ - dbus_mgr = nm_dbus_manager_get (); - g_assert (dbus_mgr != NULL); - nm_dispatcher_init (); settings = nm_settings_new (&error); @@ -413,7 +408,7 @@ main (int argc, char *argv[]) goto done; } - if (!nm_dbus_manager_get_connection (dbus_mgr)) { + if (!nm_dbus_manager_get_connection (nm_dbus_manager_get ())) { #if HAVE_DBUS_GLIB_100 nm_log_warn (LOGD_CORE, "Failed to connect to D-Bus; only private bus is available"); #else @@ -422,7 +417,7 @@ main (int argc, char *argv[]) #endif } else { /* Start our DBus service */ - if (!nm_dbus_manager_start_service (dbus_mgr)) { + if (!nm_dbus_manager_start_service (nm_dbus_manager_get ())) { nm_log_err (LOGD_CORE, "failed to start the dbus service."); goto done; } diff --git a/src/nm-dbus-manager.c b/src/nm-dbus-manager.c index 9ba0ec963c..7479e2f4a3 100644 --- a/src/nm-dbus-manager.c +++ b/src/nm-dbus-manager.c @@ -78,15 +78,18 @@ 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_instance = NULL; static gsize once = 0; if (g_once_init_enter (&once)) { singleton_instance = (NMDBusManager *) g_object_new (NM_TYPE_DBUS_MANAGER, NULL); g_assert (singleton_instance); + nm_singleton_instance_weak_ref_register (); if (!nm_dbus_manager_init_bus (singleton_instance)) start_reconnection_timeout (singleton_instance); g_once_init_leave (&once, 1);