From: Yu Watanabe Date: Sat, 5 Apr 2025 16:49:30 +0000 (+0900) Subject: udev: unconditionally send signals to workers X-Git-Tag: v258-rc1~871^2~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b6ede8e2756ebaf5049f9975f4cde81445578fd2;p=thirdparty%2Fsystemd.git udev: unconditionally send signals to workers 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. --- diff --git a/src/udev/udev-config.c b/src/udev/udev-config.c index feca748f9ec..31611ece641 100644 --- a/src/udev/udev-config.c +++ b/src/udev/udev-config.c @@ -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[]) { diff --git a/src/udev/udev-manager.c b/src/udev/udev-manager.c index 94a6d758489..b1faeedab79 100644 --- a/src/udev/udev-manager.c +++ b/src/udev/udev-manager.c @@ -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; diff --git a/src/udev/udev-manager.h b/src/udev/udev-manager.h index 3ed393c1f00..16a558e7b86 100644 --- a/src/udev/udev-manager.h +++ b/src/udev/udev-manager.h @@ -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);