From 3eb3854fcb19529b7e82f224419d177fa56c569c Mon Sep 17 00:00:00 2001 From: Aleksander Morgado Date: Sun, 13 Jan 2019 18:01:54 +0100 Subject: [PATCH] libmm-glib,manager: cleanup internal proxy on name owner updates The MMManager object keeps an internal proxy object for the Manager interface, and we must make sure we cleanup this object any time the MM daemon is restarted. Otherwise, the MMManager may end up trying to use a stale proxy associated to a previous run of the daemon, and e.g. not showing properly the runtime version info. E.g., in this sequence with the example python tester, the runtime version of the daemon was valid only for the first time the daemon runs, and if the daemon is restarted, mm_manager_get_version() would keep returning NULL. $ ./modem-watcher-python [ModemWatcher] ModemManager service not available in bus [ModemWatcher] ModemManager 1.9.990 service is available in bus [ModemWatcher] Dell Inc. (DW5821e Snapdragon X20 LTE) modem managed by ModemManager [None]: /org/freedesktop/ModemManager1/Modem/0 [ModemWatcher] ModemManager service not available in bus [ModemWatcher] ModemManager None service is available in bus [ModemWatcher] Dell Inc. (DW5821e Snapdragon X20 LTE) modem managed by ModemManager [None]: /org/freedesktop/ModemManager1/Modem/0 [ModemWatcher] ModemManager service not available in bus [ModemWatcher] ModemManager None service is available in bus [ModemWatcher] Dell Inc. (DW5821e Snapdragon X20 LTE) modem managed by ModemManager [None]: /org/freedesktop/ModemManager1/Modem/0 --- libmm-glib/mm-manager.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/libmm-glib/mm-manager.c b/libmm-glib/mm-manager.c index fe2932db..d294b32f 100644 --- a/libmm-glib/mm-manager.c +++ b/libmm-glib/mm-manager.c @@ -89,6 +89,15 @@ get_proxy_type (GDBusObjectManagerClient *manager, /*****************************************************************************/ +static void +cleanup_modem_manager1_proxy (MMManager *self) +{ + if (self->priv->manager_iface_proxy) { + g_signal_handlers_disconnect_by_func (self, cleanup_modem_manager1_proxy, NULL); + g_clear_object (&self->priv->manager_iface_proxy); + } +} + static gboolean ensure_modem_manager1_proxy (MMManager *self, GError **error) @@ -124,6 +133,12 @@ ensure_modem_manager1_proxy (MMManager *self, g_free (object_path); g_free (name); + if (self->priv->manager_iface_proxy) + g_signal_connect (self, + "notify::name-owner", + G_CALLBACK (cleanup_modem_manager1_proxy), + NULL); + return !!self->priv->manager_iface_proxy; }