]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
ply-device-manager: Consume all events in one go
authorHans de Goede <hdegoede@redhat.com>
Thu, 17 Jan 2019 13:52:41 +0000 (14:52 +0100)
committerHans de Goede <hdegoede@redhat.com>
Mon, 21 Jan 2019 14:45:00 +0000 (15:45 +0100)
Drm devices generate a bunch of add and change events when the kms
driver loads, consume these all in one go.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
src/libply-splash-core/ply-device-manager.c

index 8ceee10da2d609f15bb306aa2b6e889841899b46..028bf4add6f30b473f0f68ae9df165bb58641ca5 100644 (file)
@@ -371,7 +371,7 @@ create_devices_for_subsystem (ply_device_manager_t *manager,
         return found_device;
 }
 
-static void
+static bool
 on_udev_event (ply_device_manager_t *manager)
 {
         struct udev_device *device;
@@ -379,14 +379,14 @@ on_udev_event (ply_device_manager_t *manager)
 
         device = udev_monitor_receive_device (manager->udev_monitor);
         if (device == NULL)
-                return;
+                return false;
 
         action = udev_device_get_action (device);
 
         ply_trace ("got %s event for device %s", action, udev_device_get_sysname (device));
 
         if (action == NULL)
-                return;
+                return false;
 
         if (strcmp (action, "add") == 0) {
                 const char *subsystem;
@@ -406,6 +406,14 @@ on_udev_event (ply_device_manager_t *manager)
         }
 
         udev_device_unref (device);
+        return true;
+}
+
+static void
+on_udev_event_loop (ply_device_manager_t *manager)
+{
+        /* Call on_udev_event until all events are consumed */
+        while (on_udev_event (manager)) {}
 }
 
 static void
@@ -435,7 +443,7 @@ watch_for_udev_events (ply_device_manager_t *manager)
                                                      fd,
                                                      PLY_EVENT_LOOP_FD_STATUS_HAS_DATA,
                                                      (ply_event_handler_t)
-                                                     on_udev_event,
+                                                     on_udev_event_loop,
                                                      NULL,
                                                      manager);
 }