[gnome-control-center] common: fix udev-based device removal
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc: 
- Subject: [gnome-control-center] common: fix udev-based device removal
- Date: Tue, 11 Dec 2018 01:24:07 +0000 (UTC)
commit 008b1f68c8e8c3655dffcbb9c38fd3cd731d0108
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 3811e37fb..d9dadaa64 100644
--- a/panels/common/gsd-device-manager-udev.c
+++ b/panels/common/gsd-device-manager-udev.c
@@ -112,6 +112,7 @@ add_device (GsdUdevDeviceManager *manager,
 {
        GUdevDevice *parent;
        GsdDevice *device;
+       gchar *syspath;
 
        parent = g_udev_device_get_parent (udev_device);
 
@@ -119,7 +120,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);
 }
 
@@ -128,17 +130,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
@@ -164,8 +168,8 @@ gsd_udev_device_manager_init (GsdUdevDeviceManager *manager)
        g_autoptr(GList) devices = NULL;
        GList *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]