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:
@@ -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
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user