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:
committed by
Dan Williams
parent
debec6f650
commit
941879b43a
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user