diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2020-01-02 11:48:20 +0100 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2020-01-06 20:46:06 +0000 |
commit | 941879b43af4848b444fd299ec18fb4d92729642 (patch) | |
tree | 2f31e97dc00a4336726c5ca7cd0846ffa2e2d8b3 /src/mm-device.c | |
parent | debec6f650e395eaa722da62ce89dab2d754a059 (diff) |
device: keep reference to object manager server
Instead of having the reference to the object manager server only
while the modem is exported, just keep a reference for as long as the
device object exists. This will make it easier to handle reprobing
logic.
Diffstat (limited to 'src/mm-device.c')
-rw-r--r-- | src/mm-device.c | 67 |
1 files changed, 36 insertions, 31 deletions
diff --git a/src/mm-device.c b/src/mm-device.c index 4b3d3066..55c51186 100644 --- a/src/mm-device.c +++ b/src/mm-device.c @@ -27,11 +27,12 @@ #include "mm-plugin.h" #include "mm-log.h" -G_DEFINE_TYPE (MMDevice, mm_device, G_TYPE_OBJECT); +G_DEFINE_TYPE (MMDevice, mm_device, G_TYPE_OBJECT) enum { PROP_0, PROP_UID, + PROP_OBJECT_MANAGER, PROP_PLUGIN, PROP_MODEM, PROP_HOTPLUGGED, @@ -56,6 +57,9 @@ struct _MMDevicePrivate { /* Unique id */ gchar *uid; + /* The object manager */ + GDBusObjectManagerServer *object_manager; + /* If USB, device vid/pid */ guint16 vendor; guint16 product; @@ -74,9 +78,6 @@ struct _MMDevicePrivate { MMBaseModem *modem; gulong modem_valid_id; - /* When exported, a reference to the object manager */ - GDBusObjectManagerServer *object_manager; - /* Whether the device was hot-plugged. */ gboolean hotplugged; @@ -322,7 +323,6 @@ mm_device_remove_modem (MMDevice *self) unexport_modem (self); clear_modem (self); - g_clear_object (&(self->priv->object_manager)); } /*****************************************************************************/ @@ -333,17 +333,13 @@ modem_valid (MMBaseModem *modem, MMDevice *self) { if (!mm_base_modem_get_valid (modem)) { - GDBusObjectManagerServer *object_manager; - - object_manager = g_object_ref (self->priv->object_manager); - /* Modem no longer valid */ mm_device_remove_modem (self); if (mm_base_modem_get_reprobe (modem)) { GError *error = NULL; - if (!mm_device_create_modem (self, object_manager, &error)) { + if (!mm_device_create_modem (self, &error)) { mm_warn ("Could not recreate modem for device '%s': %s", self->priv->uid, error ? error->message : "unknown"); @@ -352,8 +348,6 @@ modem_valid (MMBaseModem *modem, mm_dbg ("Modem recreated for device '%s'", self->priv->uid); } } - - g_object_unref (object_manager); } else { /* Modem now valid, export it, but only if we really have it around. * It may happen that the initialization sequence fails because the @@ -367,12 +361,10 @@ modem_valid (MMBaseModem *modem, } gboolean -mm_device_create_modem (MMDevice *self, - GDBusObjectManagerServer *object_manager, - GError **error) +mm_device_create_modem (MMDevice *self, + GError **error) { g_assert (self->priv->modem == NULL); - g_assert (self->priv->object_manager == NULL); if (self->priv->inhibited) { g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, @@ -409,16 +401,12 @@ mm_device_create_modem (MMDevice *self, } self->priv->modem = mm_plugin_create_modem (self->priv->plugin, self, error); - if (self->priv->modem) { - /* Keep the object manager */ - self->priv->object_manager = g_object_ref (object_manager); - + if (self->priv->modem) /* We want to get notified when the modem becomes valid/invalid */ self->priv->modem_valid_id = g_signal_connect (self->priv->modem, "notify::" MM_BASE_MODEM_VALID, G_CALLBACK (modem_valid), self); - } return !!self->priv->modem; } @@ -600,13 +588,12 @@ mm_device_inhibit (MMDevice *self, } gboolean -mm_device_uninhibit (MMDevice *self, - GDBusObjectManagerServer *object_manager, - GError **error) +mm_device_uninhibit (MMDevice *self, + GError **error) { g_assert (self->priv->inhibited); self->priv->inhibited = FALSE; - return mm_device_create_modem (self, object_manager, error); + return mm_device_create_modem (self, error); } /*****************************************************************************/ @@ -644,16 +631,18 @@ mm_device_is_virtual (MMDevice *self) /*****************************************************************************/ MMDevice * -mm_device_new (const gchar *uid, - gboolean hotplugged, - gboolean virtual) +mm_device_new (const gchar *uid, + gboolean hotplugged, + gboolean virtual, + GDBusObjectManagerServer *object_manager) { g_return_val_if_fail (uid != NULL, NULL); return MM_DEVICE (g_object_new (MM_TYPE_DEVICE, - MM_DEVICE_UID, uid, - MM_DEVICE_HOTPLUGGED, hotplugged, - MM_DEVICE_VIRTUAL, virtual, + MM_DEVICE_UID, uid, + MM_DEVICE_HOTPLUGGED, hotplugged, + MM_DEVICE_VIRTUAL, virtual, + MM_DEVICE_OBJECT_MANAGER, object_manager, NULL)); } @@ -677,6 +666,10 @@ set_property (GObject *object, /* construct only */ self->priv->uid = g_value_dup_string (value); break; + case PROP_OBJECT_MANAGER: + /* construct only */ + self->priv->object_manager = g_value_dup_object (value); + break; case PROP_PLUGIN: g_clear_object (&(self->priv->plugin)); self->priv->plugin = g_value_dup_object (value); @@ -712,6 +705,9 @@ get_property (GObject *object, case PROP_UID: g_value_set_string (value, self->priv->uid); break; + case PROP_OBJECT_MANAGER: + g_value_set_object (value, self->priv->object_manager); + break; case PROP_PLUGIN: g_value_set_object (value, self->priv->plugin); break; @@ -738,6 +734,7 @@ dispose (GObject *object) { MMDevice *self = MM_DEVICE (object); + g_clear_object (&(self->priv->object_manager)); g_clear_object (&(self->priv->plugin)); g_list_free_full (self->priv->port_probes, g_object_unref); self->priv->port_probes = NULL; @@ -782,6 +779,14 @@ mm_device_class_init (MMDeviceClass *klass) G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); g_object_class_install_property (object_class, PROP_UID, properties[PROP_UID]); + properties[PROP_OBJECT_MANAGER] = + g_param_spec_object (MM_DEVICE_OBJECT_MANAGER, + "Object manager", + "GDBus object manager server", + G_TYPE_DBUS_OBJECT_MANAGER_SERVER, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); + g_object_class_install_property (object_class, PROP_OBJECT_MANAGER, properties[PROP_OBJECT_MANAGER]); + properties[PROP_PLUGIN] = g_param_spec_object (MM_DEVICE_PLUGIN, "Plugin", |