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.
This commit is contained in:
Aleksander Morgado
2020-01-06 20:46:06 +00:00
committed by Dan Williams
parent debec6f650
commit 941879b43a
3 changed files with 55 additions and 50 deletions
+5 -5
View File
@@ -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);
+36 -31
View File
@@ -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",
+14 -14
View File
@@ -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);