[systemd-devel] [PATCH 2/6] udevd: only check for changed config before scheduling new events

Tom Gundersen teg at jklm.no
Mon May 25 15:38:44 PDT 2015


Also move builtin and rules initialization from main loop to
event_queue_start().

No functional change.
---
 src/udev/udevd.c | 42 +++++++++++++++++++++++++-----------------
 1 file changed, 25 insertions(+), 17 deletions(-)

diff --git a/src/udev/udevd.c b/src/udev/udevd.c
index 91fe3d9..e309def 100644
--- a/src/udev/udevd.c
+++ b/src/udev/udevd.c
@@ -83,6 +83,8 @@ typedef struct Manager {
         int fd_worker;
         int worker_watch[2];
 
+        usec_t last_usec;
+
         bool stop_exec_queue:1;
         bool reload:1;
         bool exit:1;
@@ -732,6 +734,28 @@ static void event_queue_start(Manager *manager) {
 
         assert(manager);
 
+        if (udev_list_node_is_empty(&manager->events) ||
+            manager->exit || manager->stop_exec_queue)
+                return;
+
+        /* check for changed config, every 3 seconds at most */
+        if (manager->last_usec == 0 ||
+            (now(CLOCK_MONOTONIC) - manager->last_usec) > 3 * USEC_PER_SEC) {
+                if (udev_rules_check_timestamp(manager->rules) ||
+                    udev_builtin_validate(manager->udev))
+                        manager_reload(manager);
+
+                manager->last_usec = now(CLOCK_MONOTONIC);
+        }
+
+        udev_builtin_init(manager->udev);
+
+        if (!manager->rules) {
+                manager->rules = udev_rules_new(manager->udev, arg_resolve_names);
+                if (!manager->rules)
+                        return;
+        }
+
         udev_list_node_foreach(loop, &manager->events) {
                 struct event *event = node_to_event(loop);
 
@@ -1557,7 +1581,6 @@ int main(int argc, char *argv[]) {
                 sd_notify(1, "READY=1");
 
         for (;;) {
-                static usec_t last_usec;
                 struct epoll_event ev[8];
                 int fdcount;
                 int timeout;
@@ -1641,15 +1664,6 @@ int main(int argc, char *argv[]) {
                                 is_ctrl = true;
                 }
 
-                /* check for changed config, every 3 seconds at most */
-                if ((now(CLOCK_MONOTONIC) - last_usec) > 3 * USEC_PER_SEC) {
-                        if (udev_rules_check_timestamp(manager->rules) ||
-                            udev_builtin_validate(manager->udev))
-                                manager_reload(manager);
-
-                        last_usec = now(CLOCK_MONOTONIC);
-                }
-
                 /* event has finished */
                 if (is_worker)
                         on_worker(NULL, manager->fd_worker, 0, manager);
@@ -1659,13 +1673,7 @@ int main(int argc, char *argv[]) {
                         on_uevent(NULL, manager->fd_uevent, 0, manager);
 
                 /* start new events */
-                if (!udev_list_node_is_empty(&manager->events) && !manager->exit && !manager->stop_exec_queue) {
-                        udev_builtin_init(manager->udev);
-                        if (!manager->rules)
-                                manager->rules = udev_rules_new(manager->udev, arg_resolve_names);
-                        if (manager->rules)
-                                event_queue_start(manager);
-                }
+                event_queue_start(manager);
 
                 if (is_signal) {
                         struct signalfd_siginfo fdsi;
-- 
2.3.4



More information about the systemd-devel mailing list