From 26341578fa7431c35bc40de83cb7eed9ddaec050 Mon Sep 17 00:00:00 2001 From: Bruno Charest Date: Mon, 3 Aug 2026 15:00:39 -0400 Subject: [PATCH] fix: os.signal_opt API callback-based (V latest) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La nouvelle API est fn(os.Signal, fn(os.Signal)) au lieu de chan+variadic. Enregistrement séparé pour .hup, .int, .term. --- server.v | 50 +++++++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/server.v b/server.v index b39ac3c..50de086 100644 --- a/server.v +++ b/server.v @@ -120,30 +120,34 @@ pub fn (mut app App) run() ! { $if linux || macos { fn (mut app App) handle_signals() { - mut sigch := chan os.Signal{cap: 10} - os.signal_opt(mut sigch, .int, .term, .hup) or { panic(err) } - for { - sig := <-sigch - match sig { - .hup { - app.logger.info('server', 'reload', 'SIGHUP received, reloading config...') - new_cfg := load_config(app.config_path) or { - app.logger.error('server', 'reload', 'failed to reload config: ${err}') - continue - } - app.cfg = new_cfg - app.webhook_routes = build_webhook_routes(new_cfg) - app.ntfy = new_ntfy_client(new_cfg.server, app.logger) - app.dedup = new_dedup(new_cfg.dedup) - app.logger.info('server', 'reload', 'config reloaded successfully') - } - .int, .term { - app.logger.info('server', 'shutdown', 'received signal, shutting down...') - app.shutdown_flag = true - time.sleep(500 * time.millisecond) - exit(0) - } + // Register SIGHUP handler for config reload + os.signal_opt(.hup, fn [mut app] (sig os.Signal) { + app.logger.info('server', 'reload', 'SIGHUP received, reloading config...') + new_cfg := load_config(app.config_path) or { + app.logger.error('server', 'reload', 'failed to reload config: ${err}') + return } + app.cfg = new_cfg + app.webhook_routes = build_webhook_routes(new_cfg) + app.ntfy = new_ntfy_client(new_cfg.server, app.logger) + app.dedup = new_dedup(new_cfg.dedup) + app.logger.info('server', 'reload', 'config reloaded successfully') + }) or { panic(err) } + + // Common shutdown handler for SIGINT and SIGTERM + shutdown := fn [mut app] (sig os.Signal) { + app.logger.info('server', 'shutdown', 'received signal, shutting down...') + app.shutdown_flag = true + time.sleep(500 * time.millisecond) + exit(0) + } + + os.signal_opt(.int, shutdown) or { panic(err) } + os.signal_opt(.term, shutdown) or { panic(err) } + + // Keep goroutine alive + for { + time.sleep(60 * time.second) } } }