From 539563c53fd2b5e54e61e48016f31429ca8cc139 Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Wed, 10 Jun 2026 01:54:20 +0800 Subject: [PATCH] =?UTF-8?q?feat(runtime):=20=E9=80=9A=E8=BF=87=20signalfd?= =?UTF-8?q?=20=E5=B0=86=E4=BF=A1=E5=8F=B7=E5=A4=84=E7=90=86=E9=9B=86?= =?UTF-8?q?=E6=88=90=E5=88=B0=20poll=20=E4=BA=8B=E4=BB=B6=E5=BE=AA?= =?UTF-8?q?=E7=8E=AF=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/runtime/runtime.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/runtime/runtime.c b/src/runtime/runtime.c index 9007084..1a58fdf 100644 --- a/src/runtime/runtime.c +++ b/src/runtime/runtime.c @@ -1,9 +1,12 @@ #include "runtime/runtime.h" +#include #include +#include #include #include #include +#include #include #include @@ -32,6 +35,7 @@ typedef struct runtime_t { bool running; bool will_restart; + int signal_fd; plan_t plan; command_buffer_t command_buffer; @@ -131,6 +135,7 @@ static bool runtime_init(runtime_t *runtime, runtime_init_desc_t *desc) { runtime->backend = desc->backend; layout_registry_move(&desc->layouts, &runtime->layouts); rules_move(&desc->rules, &runtime->rules); + runtime->signal_fd = -1; runtime->border = desc->border; runtime->config_module_handle = desc->config_module_handle; runtime->binding_table = desc->binding_table; @@ -199,6 +204,9 @@ static void runtime_shutdown(runtime_t *runtime) { runtime->config_module_handle = nullptr; bar_cleanup(&runtime->bar); + + close(runtime->signal_fd); + runtime->signal_fd = -1; } static void runtime_notify_initial_state(runtime_t *runtime) { @@ -262,7 +270,19 @@ static void runtime_setup_bindings(runtime_t *runtime) { plan_reset(plan); } +static inline void runtime_setup_signal(runtime_t *runtime) { + sigset_t mask; + sigemptyset(&mask); + sigaddset(&mask, SIGINT); + sigaddset(&mask, SIGTERM); + sigaddset(&mask, SIGQUIT); + sigprocmask(SIG_BLOCK, &mask, nullptr); + + runtime->signal_fd = signalfd(-1, &mask, SFD_CLOEXEC); +} + static void runtime_setup(runtime_t *runtime) { + runtime_setup_signal(runtime); runtime_setup_bindings(runtime); runtime_init_bar(runtime); @@ -483,6 +503,7 @@ static void runtime_run_event_loop(runtime_t *runtime) { struct pollfd fds[] = { [0] = {.fd = backend_fd, .events = POLLIN | POLLHUP}, [1] = {.fd = runtime->bar.timerfd, .events = POLLIN}, + [2] = {.fd = runtime->signal_fd, .events = POLLIN}, }; while (runtime->running) { @@ -498,6 +519,12 @@ static void runtime_run_event_loop(runtime_t *runtime) { runtime_update_bar(runtime); } } + + if (fds[2].revents & POLLIN) { + struct signalfd_siginfo info = {0}; + read(fds[2].fd, &info, sizeof(info)); + runtime->running = false; + } } }