diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2021-02-12 11:02:14 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2021-02-25 12:13:16 +0100 |
commit | b8e076f9c47669d58179cb67a829966b867c6fe6 (patch) | |
tree | b9e8fd255f176e16fafae5a4fdfa72cac66bdf7e /src | |
parent | 1b35d74c157417e40877535eec757e5cd725564f (diff) |
kernel-device-udev: keep track of the client object
Instead of creating new clients internally whenever we need them, just
make sure each MMKernelDeviceUdev object keeps a full reference to the
GUdevClient that generated all GUdevDevices.
Diffstat (limited to 'src')
-rw-r--r-- | src/kerneldevice/mm-kernel-device-udev.c | 48 | ||||
-rw-r--r-- | src/kerneldevice/mm-kernel-device-udev.h | 6 | ||||
-rw-r--r-- | src/mm-base-manager.c | 19 |
3 files changed, 47 insertions, 26 deletions
diff --git a/src/kerneldevice/mm-kernel-device-udev.c b/src/kerneldevice/mm-kernel-device-udev.c index 237d7201..0687ec64 100644 --- a/src/kerneldevice/mm-kernel-device-udev.c +++ b/src/kerneldevice/mm-kernel-device-udev.c @@ -31,6 +31,7 @@ G_DEFINE_TYPE_EXTENDED (MMKernelDeviceUdev, mm_kernel_device_udev, MM_TYPE_KERN enum { PROP_0, + PROP_UDEV_CLIENT, PROP_UDEV_DEVICE, PROP_PROPERTIES, PROP_LAST @@ -39,6 +40,7 @@ enum { static GParamSpec *properties[PROP_LAST]; struct _MMKernelDeviceUdevPrivate { + GUdevClient *client; GUdevDevice *device; GUdevDevice *interface; @@ -565,7 +567,8 @@ kernel_device_get_attribute (MMKernelDevice *_self, /*****************************************************************************/ MMKernelDevice * -mm_kernel_device_udev_new (GUdevDevice *udev_device) +mm_kernel_device_udev_new (GUdevClient *udev_client, + GUdevDevice *udev_device) { GError *error = NULL; MMKernelDevice *self; @@ -574,6 +577,7 @@ mm_kernel_device_udev_new (GUdevDevice *udev_device) self = MM_KERNEL_DEVICE (g_initable_new (MM_TYPE_KERNEL_DEVICE_UDEV, NULL, &error, + "udev-client", udev_client, "udev-device", udev_device, NULL)); g_assert_no_error (error); @@ -583,13 +587,15 @@ mm_kernel_device_udev_new (GUdevDevice *udev_device) /*****************************************************************************/ MMKernelDevice * -mm_kernel_device_udev_new_from_properties (MMKernelEventProperties *props, +mm_kernel_device_udev_new_from_properties (GUdevClient *udev_client, + MMKernelEventProperties *props, GError **error) { return MM_KERNEL_DEVICE (g_initable_new (MM_TYPE_KERNEL_DEVICE_UDEV, NULL, error, - "properties", props, + "udev-client", udev_client, + "properties", props, NULL)); } @@ -611,6 +617,10 @@ set_property (GObject *object, MMKernelDeviceUdev *self = MM_KERNEL_DEVICE_UDEV (object); switch (prop_id) { + case PROP_UDEV_CLIENT: + g_assert (!self->priv->client); + self->priv->client = g_value_dup_object (value); + break; case PROP_UDEV_DEVICE: g_assert (!self->priv->device); self->priv->device = g_value_dup_object (value); @@ -634,6 +644,9 @@ get_property (GObject *object, MMKernelDeviceUdev *self = MM_KERNEL_DEVICE_UDEV (object); switch (prop_id) { + case PROP_UDEV_CLIENT: + g_value_set_object (value, self->priv->client); + break; case PROP_UDEV_DEVICE: g_value_set_object (value, self->priv->device); break; @@ -655,6 +668,12 @@ initable_init (GInitable *initable, const gchar *subsystem; const gchar *name; + if (!self->priv->client) { + g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_INVALID_ARGS, + "missing client in kernel device"); + return FALSE; + } + /* When created from a GUdevDevice, we're done */ if (self->priv->device) { preload_contents (self); @@ -684,23 +703,15 @@ initable_init (GInitable *initable, /* On remove events, we don't look for the GUdevDevice */ if (g_strcmp0 (mm_kernel_event_properties_get_action (self->priv->properties), "remove")) { - GUdevClient *client; - GUdevDevice *device; - - client = g_udev_client_new (NULL); - device = g_udev_client_query_by_subsystem_and_name (client, subsystem, name); - if (!device) { + g_assert (!self->priv->device); + self->priv->device = g_udev_client_query_by_subsystem_and_name (self->priv->client, subsystem, name); + if (!self->priv->device) { g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_INVALID_ARGS, "device %s/%s not found", subsystem, name); - g_object_unref (client); return FALSE; } - - /* Store device */ - self->priv->device = device; - g_object_unref (client); } if (self->priv->device) @@ -717,6 +728,7 @@ dispose (GObject *object) g_clear_object (&self->priv->physdev); g_clear_object (&self->priv->interface); g_clear_object (&self->priv->device); + g_clear_object (&self->priv->client); g_clear_object (&self->priv->properties); G_OBJECT_CLASS (mm_kernel_device_udev_parent_class)->dispose (object); @@ -774,6 +786,14 @@ mm_kernel_device_udev_class_init (MMKernelDeviceUdevClass *klass) G_PARAM_READWRITE); g_object_class_install_property (object_class, PROP_UDEV_DEVICE, properties[PROP_UDEV_DEVICE]); + properties[PROP_UDEV_CLIENT] = + g_param_spec_object ("udev-client", + "udev client", + "GUdev client", + G_UDEV_TYPE_CLIENT, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); + g_object_class_install_property (object_class, PROP_UDEV_CLIENT, properties[PROP_UDEV_CLIENT]); + properties[PROP_PROPERTIES] = g_param_spec_object ("properties", "Properties", diff --git a/src/kerneldevice/mm-kernel-device-udev.h b/src/kerneldevice/mm-kernel-device-udev.h index 34445b24..93153b3b 100644 --- a/src/kerneldevice/mm-kernel-device-udev.h +++ b/src/kerneldevice/mm-kernel-device-udev.h @@ -48,8 +48,10 @@ struct _MMKernelDeviceUdevClass { GType mm_kernel_device_udev_get_type (void); G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMKernelDeviceUdev, g_object_unref) -MMKernelDevice *mm_kernel_device_udev_new (GUdevDevice *udev_device); -MMKernelDevice *mm_kernel_device_udev_new_from_properties (MMKernelEventProperties *properties, +MMKernelDevice *mm_kernel_device_udev_new (GUdevClient *udev_client, + GUdevDevice *udev_device); +MMKernelDevice *mm_kernel_device_udev_new_from_properties (GUdevClient *udev_client, + MMKernelEventProperties *properties, GError **error); #endif /* MM_KERNEL_DEVICE_UDEV_H */ diff --git a/src/mm-base-manager.c b/src/mm-base-manager.c index 130e5ad1..4e866f8a 100644 --- a/src/mm-base-manager.c +++ b/src/mm-base-manager.c @@ -407,7 +407,7 @@ handle_kernel_event (MMBaseManager *self, g_autoptr(MMKernelDevice) kernel_device = NULL; #if defined WITH_UDEV if (!mm_context_get_test_no_udev ()) - kernel_device = mm_kernel_device_udev_new_from_properties (properties, error); + kernel_device = mm_kernel_device_udev_new_from_properties (self->priv->udev, properties, error); else #endif kernel_device = mm_kernel_device_generic_new (properties, error); @@ -436,7 +436,7 @@ handle_uevent (MMBaseManager *self, if (g_str_equal (action, "add") || g_str_equal (action, "move") || g_str_equal (action, "change")) { g_autoptr(MMKernelDevice) kernel_device = NULL; - kernel_device = mm_kernel_device_udev_new (device); + kernel_device = mm_kernel_device_udev_new (self->priv->udev, device); device_added (self, kernel_device, TRUE, FALSE); return; } @@ -458,7 +458,7 @@ start_device_added_idle (StartDeviceAdded *ctx) { MMKernelDevice *kernel_device; - kernel_device = mm_kernel_device_udev_new (ctx->device); + kernel_device = mm_kernel_device_udev_new (ctx->self->priv->udev, ctx->device); device_added (ctx->self, kernel_device, FALSE, ctx->manual_scan); g_object_unref (kernel_device); @@ -1426,13 +1426,12 @@ initable_init (GInitable *initable, return FALSE; #if defined WITH_UDEV - if (!mm_context_get_test_no_udev ()) { - /* Create udev client based on the subsystems requested by the plugins */ - self->priv->udev = g_udev_client_new (mm_plugin_manager_get_subsystems (self->priv->plugin_manager)); - /* If autoscan enabled, list for udev events */ - if (self->priv->auto_scan) - g_signal_connect_swapped (self->priv->udev, "uevent", G_CALLBACK (handle_uevent), initable); - } + /* Create udev client based on the subsystems requested by the plugins */ + self->priv->udev = g_udev_client_new (mm_plugin_manager_get_subsystems (self->priv->plugin_manager)); + + /* If autoscan enabled, list for udev events */ + if (!mm_context_get_test_no_udev () && self->priv->auto_scan) + g_signal_connect_swapped (self->priv->udev, "uevent", G_CALLBACK (handle_uevent), initable); #endif /* Export the manager interface */ |