aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2020-01-02 11:48:20 +0100
committerDan Williams <dcbw@redhat.com>2020-01-06 20:46:06 +0000
commit941879b43af4848b444fd299ec18fb4d92729642 (patch)
tree2f31e97dc00a4336726c5ca7cd0846ffa2e2d8b3 /src
parentdebec6f650e395eaa722da62ce89dab2d754a059 (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')
-rw-r--r--src/mm-base-manager.c10
-rw-r--r--src/mm-device.c67
-rw-r--r--src/mm-device.h28
3 files changed, 55 insertions, 50 deletions
diff --git a/src/mm-base-manager.c b/src/mm-base-manager.c
index 55382e30..d5899466 100644
--- a/src/mm-base-manager.c
+++ b/src/mm-base-manager.c
@@ -192,7 +192,7 @@ device_support_check_ready (MMPluginManager *plugin_manager,
mm_device_set_plugin (ctx->device, G_OBJECT (plugin));
g_object_unref (plugin);
- if (!mm_device_create_modem (ctx->device, ctx->self->priv->object_manager, &error)) {
+ if (!mm_device_create_modem (ctx->device, &error)) {
mm_warn ("Couldn't create modem for device '%s': %s",
mm_device_get_uid (ctx->device), error->message);
g_error_free (error);
@@ -368,7 +368,7 @@ device_added (MMBaseManager *manager,
subsys, name, physdev_uid);
/* Keep the device listed in the Manager */
- device = mm_device_new (physdev_uid, hotplugged, FALSE);
+ device = mm_device_new (physdev_uid, hotplugged, FALSE, manager->priv->object_manager);
g_hash_table_insert (manager->priv->devices,
g_strdup (physdev_uid),
device);
@@ -1084,7 +1084,7 @@ remove_device_inhibition (MMBaseManager *self,
GError *error = NULL;
/* Uninhibit device, which will create and expose the modem object */
- if (!mm_device_uninhibit (device, self->priv->object_manager, &error)) {
+ if (!mm_device_uninhibit (device, &error)) {
mm_warn ("Couldn't uninhibit device: %s", error->message);
g_error_free (error);
}
@@ -1271,7 +1271,7 @@ handle_set_profile (MmGdbusTest *skeleton,
/* Create device and keep it listed in the Manager */
physdev_uid = g_strdup_printf ("/virtual/%s", id);
- device = mm_device_new (physdev_uid, TRUE, TRUE);
+ device = mm_device_new (physdev_uid, TRUE, TRUE, self->priv->object_manager);
g_hash_table_insert (self->priv->devices, physdev_uid, device);
/* Grab virtual ports */
@@ -1292,7 +1292,7 @@ handle_set_profile (MmGdbusTest *skeleton,
mm_device_set_plugin (device, G_OBJECT (plugin));
/* Create modem */
- if (!mm_device_create_modem (device, self->priv->object_manager, &error)) {
+ if (!mm_device_create_modem (device, &error)) {
mm_warn ("Couldn't create modem for virtual device '%s': %s",
mm_device_get_uid (device),
error->message);
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",
diff --git a/src/mm-device.h b/src/mm-device.h
index b00d1314..b7a3285c 100644
--- a/src/mm-device.h
+++ b/src/mm-device.h
@@ -33,12 +33,13 @@ typedef struct _MMDevice MMDevice;
typedef struct _MMDeviceClass MMDeviceClass;
typedef struct _MMDevicePrivate MMDevicePrivate;
-#define MM_DEVICE_UID "uid"
-#define MM_DEVICE_PLUGIN "plugin"
-#define MM_DEVICE_MODEM "modem"
-#define MM_DEVICE_HOTPLUGGED "hotplugged"
-#define MM_DEVICE_VIRTUAL "virtual"
-#define MM_DEVICE_INHIBITED "inhibited"
+#define MM_DEVICE_UID "uid"
+#define MM_DEVICE_PLUGIN "plugin"
+#define MM_DEVICE_MODEM "modem"
+#define MM_DEVICE_HOTPLUGGED "hotplugged"
+#define MM_DEVICE_VIRTUAL "virtual"
+#define MM_DEVICE_INHIBITED "inhibited"
+#define MM_DEVICE_OBJECT_MANAGER "object-manager"
#define MM_DEVICE_PORT_GRABBED "port-grabbed"
#define MM_DEVICE_PORT_RELEASED "port-released"
@@ -60,9 +61,10 @@ struct _MMDeviceClass {
GType mm_device_get_type (void);
-MMDevice *mm_device_new (const gchar *uid,
- gboolean hotplugged,
- gboolean virtual);
+MMDevice *mm_device_new (const gchar *uid,
+ gboolean hotplugged,
+ gboolean virtual,
+ GDBusObjectManagerServer *object_manager);
void mm_device_grab_port (MMDevice *self,
MMKernelDevice *kernel_port);
@@ -73,10 +75,9 @@ gboolean mm_device_owns_port (MMDevice *self,
void mm_device_ignore_port (MMDevice *self,
MMKernelDevice *kernel_port);
-gboolean mm_device_create_modem (MMDevice *self,
- GDBusObjectManagerServer *object_manager,
- GError **error);
-void mm_device_remove_modem (MMDevice *self);
+gboolean mm_device_create_modem (MMDevice *self,
+ GError **error);
+void mm_device_remove_modem (MMDevice *self);
void mm_device_inhibit (MMDevice *self,
GAsyncReadyCallback callback,
@@ -85,7 +86,6 @@ gboolean mm_device_inhibit_finish (MMDevice *self,
GAsyncResult *res,
GError **error);
gboolean mm_device_uninhibit (MMDevice *self,
- GDBusObjectManagerServer *object_manager,
GError **error);