chiark / gitweb /
udevd: always try to find an idle worker instead of forking a new one
authorKay Sievers <kay.sievers@vrfy.org>
Mon, 26 Apr 2010 10:21:16 +0000 (12:21 +0200)
committerKay Sievers <kay.sievers@vrfy.org>
Mon, 26 Apr 2010 10:25:59 +0000 (12:25 +0200)
We special-handle events with a TIMEOUT= set, so they don't get queued
or wait for parent events to finish, to make sure we can handle them
as fast as possible.

With this change we first try to find an idle worker process before
forking a new one.

udev/udevd.c

index c27b4cd6aa2cd13052335d9433ee5ef74a5d4cb0..7712543734aba9bf86d04f79e911683538500686 100644 (file)
@@ -360,7 +360,7 @@ static void worker_new(struct event *event)
        }
 }
 
-static void event_run(struct event *event)
+static void event_run(struct event *event, bool force)
 {
        struct udev_list_node *loop;
 
@@ -385,7 +385,7 @@ static void event_run(struct event *event)
                return;
        }
 
-       if (childs >= max_childs) {
+       if (!force && childs >= max_childs) {
                info(event->udev, "maximum number (%i) of childs reached\n", childs);
                return;
        }
@@ -420,7 +420,7 @@ static void event_queue_insert(struct udev_device *dev)
 
        /* run all events with a timeout set immediately */
        if (udev_device_get_timeout(dev) > 0) {
-               worker_new(event);
+               event_run(event, true);
                return;
        }
 }
@@ -552,7 +552,7 @@ static void events_start(struct udev *udev)
                        continue;
                }
 
-               event_run(event);
+               event_run(event, false);
        }
 }