summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Langasek <steve.langasek@canonical.com>2011-10-08 02:14:09 -0700
committerKay Sievers <kay.sievers@vrfy.org>2011-10-08 15:02:38 +0200
commit7944a13a2b8516d5fa354703789f5988cb4299b6 (patch)
treed5fcb33a742c481a308e950ac3f1ba0c55e43cc7
parentdd2247464f56f0cffe92250bb107e97477effbc2 (diff)
udevd: exit - process events before signals in worker
When a worker receives both a signal and a udev event in the same epoll_wait run, the event must be processed first because the udev parent considers the event already dispatched. If we process the signal first and exit, udevd times out after 60 seconds waiting for a response from an already-dead worker. Ref: https://bugs.launchpad.net/bugs/818177 Signed-off-by: Steve Langasek <steve.langasek@canonical.com>
-rw-r--r--udev/udevd.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/udev/udevd.c b/udev/udevd.c
index 77aec9d2ae..b65b53f7ed 100644
--- a/udev/udevd.c
+++ b/udev/udevd.c
@@ -347,6 +347,7 @@ static void worker_new(struct event *event)
for (i = 0; i < fdcount; i++) {
if (ev[i].data.fd == fd_monitor && ev[i].events & EPOLLIN) {
dev = udev_monitor_receive_device(worker_monitor);
+ break;
} else if (ev[i].data.fd == fd_signal && ev[i].events & EPOLLIN) {
struct signalfd_siginfo fdsi;
ssize_t size;