diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2019-01-13 18:01:54 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2019-01-13 18:01:54 +0100 |
commit | 3eb3854fcb19529b7e82f224419d177fa56c569c (patch) | |
tree | d72d0dc84d044b2bc121e41b10851a4773907906 | |
parent | 479590412e6b746365645eb9bbc9c605c20ab8bc (diff) |
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
-rw-r--r-- | libmm-glib/mm-manager.c | 15 |
1 files changed, 15 insertions, 0 deletions
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; } |