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.
This commit is contained in:
Yu Watanabe
2025-04-07 22:17:16 +09:00
parent b75841029f
commit b6ede8e275
3 changed files with 10 additions and 23 deletions
+3 -3
View 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[]) {
+6 -19
View 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;
+1 -1
View 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);