summaryrefslogtreecommitdiff
path: root/udev/udevd.c
diff options
context:
space:
mode:
authorOlaf Kirch <okir@suse.de>2009-01-21 11:17:11 +0100
committerKay Sievers <kay.sievers@vrfy.org>2009-01-21 11:17:11 +0100
commitd1cc6562f3b8fb17d061aa37aedd40163dd714e5 (patch)
tree5f22cdf95832dc8cbbc24376e05268b28142f6f3 /udev/udevd.c
parente9a77fd828e9d415e4d64dd74aa780a61f726536 (diff)
reap children faster
udevd's event_queue_manager loop is pretty sensitive to the delays of exiting child processes. I found that it helps boot times if we try to reap children as quickly as possible. This patch changes event_queue_manager to call sigchilds_waiting if it finds a signal has been received. Signed-off-by: Olaf Kirch <okir@suse.de>
Diffstat (limited to 'udev/udevd.c')
-rw-r--r--udev/udevd.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/udev/udevd.c b/udev/udevd.c
index d227a71fd1..9a278ce1f3 100644
--- a/udev/udevd.c
+++ b/udev/udevd.c
@@ -59,6 +59,8 @@ static void log_fn(struct udev *udev, int priority,
}
}
+static void reap_sigchilds(void);
+
static int debug_trace;
static struct udev_rules *rules;
static struct udev_ctrl *udev_ctrl;
@@ -403,6 +405,7 @@ static void event_queue_manager(struct udev *udev)
struct udev_list_node *loop;
struct udev_list_node *tmp;
+start_over:
if (udev_list_is_empty(&event_list)) {
if (childs > 0) {
err(udev, "event list empty, but childs count is %i", childs);
@@ -432,6 +435,13 @@ static void event_queue_manager(struct udev *udev)
event_fork(loop_event);
dbg(udev, "moved seq %llu to running list\n", udev_device_get_seqnum(loop_event->dev));
+
+ /* retry if events finished in the meantime */
+ if (sigchilds_waiting) {
+ sigchilds_waiting = 0;
+ reap_sigchilds();
+ goto start_over;
+ }
}
}