From b6ede8e2756ebaf5049f9975f4cde81445578fd2 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 6 Apr 2025 01:49:30 +0900 Subject: [PATCH] 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. --- src/udev/udev-config.c | 6 +++--- src/udev/udev-manager.c | 25 ++++++------------------- src/udev/udev-manager.h | 2 +- 3 files changed, 10 insertions(+), 23 deletions(-) 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); -- 2.47.3