diff options
author | Olaf Kirch <okir@suse.de> | 2009-01-21 11:17:11 +0100 |
---|---|---|
committer | Kay Sievers <kay.sievers@vrfy.org> | 2009-01-21 11:17:11 +0100 |
commit | d1cc6562f3b8fb17d061aa37aedd40163dd714e5 (patch) | |
tree | 5f22cdf95832dc8cbbc24376e05268b28142f6f3 /udev | |
parent | e9a77fd828e9d415e4d64dd74aa780a61f726536 (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')
-rw-r--r-- | udev/udevd.c | 10 |
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; + } } } |