[PATCH 1/4] xserver: process udev "changed" and "add" events in the same code paths

Lennart Poettering lennart at poettering.net
Mon Jul 18 12:17:10 PDT 2011


udev gives no guarantee that before each "changed" event for a device
there's an "add" event, or that before each "remove" is an "add", or
that before each "add" there was no "add" already and so on. Users can
trigger these events at any time with "udevadm trigger", and netlink is
a lossy transport, hence the events can come in unexpected ordering.

With other words: regardless which event is generated, the X server must
not choke on it and make the best of it, hence make sure that if we get
an "add" event for an existing device we don't add the device a second
time.
---
 config/udev.c |    8 +++-----
 1 files changed, 3 insertions(+), 5 deletions(-)

diff --git a/config/udev.c b/config/udev.c
index 9ac34ee..5ac52a1 100644
--- a/config/udev.c
+++ b/config/udev.c
@@ -251,14 +251,12 @@ wakeup_handler(pointer data, int err, pointer read_mask)
             return;
         action = udev_device_get_action(udev_device);
         if (action) {
-            if (!strcmp(action, "add"))
-                device_added(udev_device);
-            else if (!strcmp(action, "remove"))
-                device_removed(udev_device);
-            else if (!strcmp(action, "change")) {
+            if (!strcmp(action, "add") || !strcmp(action, "change")) {
                 device_removed(udev_device);
                 device_added(udev_device);
             }
+            else if (!strcmp(action, "remove"))
+                device_removed(udev_device);
         }
         udev_device_unref(udev_device);
     }
-- 
1.7.6



Lennart

-- 
Lennart Poettering - Red Hat, Inc.


More information about the xorg-devel mailing list