summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichel Dänzer <michel.daenzer@amd.com>2016-10-25 17:28:03 +0900
committerMichel Dänzer <michel@daenzer.net>2016-10-26 16:00:09 +0900
commit22b5ce9548393ba2ff73ee234ecd82eeaf0ef6c4 (patch)
treea9edf9efe631c5e927d51a2a944603563f3bd62e
parent82d3c8f5500d2a6fb1495e217a0b79c396f1534c (diff)
Consume all available udev events at once
We get multiple udev events for actions like docking a laptop into its station or plugging a monitor to the station. By consuming as many events as we can, we reduce the number of output re-evalutions. It depends on the timing how many events can be consumed at once. (Inspired by xserver commit 363f4273dd4aec3e26cc57ecb6c20f27e6c813d8) Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--src/drmmode_display.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index a5a34fdb..9cf48467 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -2656,12 +2656,15 @@ drmmode_handle_uevents(int fd, void *closure)
drmmode_ptr drmmode = closure;
ScrnInfoPtr scrn = drmmode->scrn;
struct udev_device *dev;
- dev = udev_monitor_receive_device(drmmode->uevent_monitor);
- if (!dev)
- return;
+ Bool received = FALSE;
+
+ while ((dev = udev_monitor_receive_device(drmmode->uevent_monitor))) {
+ udev_device_unref(dev);
+ received = TRUE;
+ }
- radeon_mode_hotplug(scrn, drmmode);
- udev_device_unref(dev);
+ if (received)
+ radeon_mode_hotplug(scrn, drmmode);
}
#endif