[gnome-control-center/rhel/8.4.0: 15/32] common: fix udev-based device removal
- From: Ray Strode <halfline src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-control-center/rhel/8.4.0: 15/32] common: fix udev-based device removal
- Date: Tue, 13 Apr 2021 14:34:54 +0000 (UTC)
commit 1fd3849af62b34c724bee2c741f6fab906bcb200
Author: Peter Hutterer <peter hutterer who-t net>
Date: Mon Dec 10 14:43:30 2018 +1000
common: fix udev-based device removal
libgudev allocs a new GUdevDevice object for each event, so the pointer value
for the 'add' udev event differs from the one for the 'remove' event. If we
use the pointer value as hash table key, we'll never remove the device.
Switch to use the syspath of the device instead, that one is unique per
device.
Fixes #309
panels/common/gsd-device-manager-udev.c | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
---
diff --git a/panels/common/gsd-device-manager-udev.c b/panels/common/gsd-device-manager-udev.c
index aa9304232..105c8e987 100644
--- a/panels/common/gsd-device-manager-udev.c
+++ b/panels/common/gsd-device-manager-udev.c
@@ -122,6 +122,7 @@ add_device (GsdUdevDeviceManager *manager,
{
GUdevDevice *parent;
GsdDevice *device;
+ gchar *syspath;
parent = g_udev_device_get_parent (udev_device);
@@ -129,7 +130,8 @@ add_device (GsdUdevDeviceManager *manager,
return;
device = create_device (udev_device);
- g_hash_table_insert (manager->devices, g_object_ref (udev_device), device);
+ syspath = g_strdup (g_udev_device_get_sysfs_path (udev_device));
+ g_hash_table_insert (manager->devices, syspath, device);
g_signal_emit_by_name (manager, "device-added", device);
}
@@ -138,17 +140,19 @@ remove_device (GsdUdevDeviceManager *manager,
GUdevDevice *udev_device)
{
GsdDevice *device;
+ gchar *syspath;
- device = g_hash_table_lookup (manager->devices, udev_device);
+ syspath = g_strdup (g_udev_device_get_sysfs_path (udev_device));
+ device = g_hash_table_lookup (manager->devices, syspath);
if (!device)
return;
- g_hash_table_steal (manager->devices, udev_device);
+ g_hash_table_steal (manager->devices, syspath);
g_signal_emit_by_name (manager, "device-removed", device);
g_object_unref (device);
- g_object_unref (udev_device);
+ g_free (syspath);
}
static void
@@ -173,8 +177,8 @@ gsd_udev_device_manager_init (GsdUdevDeviceManager *manager)
const gchar *subsystems[] = { "input", NULL };
GList *devices, *l;
- manager->devices = g_hash_table_new_full (NULL, NULL,
- (GDestroyNotify) g_object_unref,
+ manager->devices = g_hash_table_new_full (g_str_hash, g_str_equal,
+ (GDestroyNotify) g_free,
(GDestroyNotify) g_object_unref);
manager->udev_client = g_udev_client_new (subsystems);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]