Blame SOURCES/0001-common-fix-udev-based-device-removal.patch

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