]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev: unconditionally send signals to workers
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 5 Apr 2025 16:49:30 +0000 (01:49 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 7 Apr 2025 13:17:16 +0000 (22:17 +0900)
It is not necessary to wait for a worker processing an event before
sending SIGTERM. Workers will handle SIGTERM after they finish events
that they are currently processing. Let's send SIGTERM whenever it
necessary.

src/udev/udev-config.c
src/udev/udev-manager.c
src/udev/udev-manager.h

index feca748f9ecdfb582e63e8c1914cd90b173a899d..31611ece6414020aa73c1bcbdfbe6f3fae511f78 100644 (file)
@@ -342,7 +342,7 @@ void manager_set_log_level(Manager *manager, int log_level) {
                 return;
 
         log_set_max_level(manager->config.log_level);
-        manager_kill_workers(manager, /* force = */ false);
+        manager_kill_workers(manager, SIGTERM);
 }
 
 void manager_set_trace(Manager *manager, bool enable) {
@@ -357,7 +357,7 @@ void manager_set_trace(Manager *manager, bool enable) {
                 return;
 
         log_set_max_level(manager->config.log_level);
-        manager_kill_workers(manager, /* force = */ false);
+        manager_kill_workers(manager, SIGTERM);
 }
 
 static void manager_adjust_config(UdevConfig *config) {
@@ -433,7 +433,7 @@ void manager_set_environment(Manager *manager, char * const *v) {
         }
 
         if (changed)
-                manager_kill_workers(manager, /* force = */ false);
+                manager_kill_workers(manager, SIGTERM);
 }
 
 int manager_load(Manager *manager, int argc, char *argv[]) {
index 94a6d75848907452d2a00f515e0c4af2542389cc..b1faeedab79be411213bc472cb2221915003b268 100644 (file)
@@ -77,7 +77,6 @@ typedef enum WorkerState {
         WORKER_RUNNING,
         WORKER_IDLE,
         WORKER_KILLED,
-        WORKER_KILLING,
 } WorkerState;
 
 typedef struct Worker {
@@ -208,22 +207,13 @@ static int worker_new(Worker **ret, Manager *manager, sd_device_monitor *worker_
         return 0;
 }
 
-void manager_kill_workers(Manager *manager, bool force) {
-        Worker *worker;
-
+void manager_kill_workers(Manager *manager, int signo) {
         assert(manager);
 
+        Worker *worker;
         HASHMAP_FOREACH(worker, manager->workers) {
-                if (worker->state == WORKER_KILLED)
-                        continue;
-
-                if (worker->state == WORKER_RUNNING && !force) {
-                        worker->state = WORKER_KILLING;
-                        continue;
-                }
-
                 worker->state = WORKER_KILLED;
-                (void) pidref_kill(&worker->pidref, SIGTERM);
+                (void) pidref_kill(&worker->pidref, signo);
         }
 }
 
@@ -286,7 +276,7 @@ void manager_exit(Manager *manager) {
 
         /* discard queued events and kill workers */
         event_queue_cleanup(manager, EVENT_QUEUED);
-        manager_kill_workers(manager, true);
+        manager_kill_workers(manager, SIGTERM);
 }
 
 void notify_ready(Manager *manager) {
@@ -332,7 +322,7 @@ void manager_reload(Manager *manager, bool force) {
         flags |= manager_reload_config(manager);
 
         if (FLAGS_SET(flags, UDEV_RELOAD_KILL_WORKERS))
-                manager_kill_workers(manager, false);
+                manager_kill_workers(manager, SIGTERM);
 
         udev_builtin_reload(flags);
 
@@ -844,10 +834,7 @@ static int on_worker_notify(sd_event_source *s, int fd, uint32_t revents, void *
                 event_free(worker->event);
 
         /* Update the state of the worker. */
-        if (worker->state == WORKER_KILLING) {
-                worker->state = WORKER_KILLED;
-                (void) pidref_kill(&worker->pidref, SIGTERM);
-        } else if (worker->state != WORKER_KILLED)
+        if (worker->state != WORKER_KILLED)
                 worker->state = WORKER_IDLE;
 
         return 0;
index 3ed393c1f00c7052475a8862e37d6c548bb26b2f..16a558e7b869b45c40974e75b888553a23d4d798 100644 (file)
@@ -63,7 +63,7 @@ void manager_exit(Manager *manager);
 
 void notify_ready(Manager *manager);
 
-void manager_kill_workers(Manager *manager, bool force);
+void manager_kill_workers(Manager *manager, int signo);
 
 bool devpath_conflict(const char *a, const char *b);