From: Olaf Kirch Date: Wed, 21 Jan 2009 10:17:11 +0000 (+0100) Subject: reap children faster X-Git-Tag: 174~1192 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=d1cc6562f3b8fb17d061aa37aedd40163dd714e5;ds=inline 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 --- diff --git a/udev/udevd.c b/udev/udevd.c index d227a71fd..9a278ce1f 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; + } } }