From 436c0ea08722544b54ed0127f1ed73f326f43311 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=85=E3=81=AE=E5=A3=AB?= Date: Thu, 17 Apr 2025 17:24:05 +0800 Subject: [PATCH] optimize no-blocking start call http_server_stop multi-process mode main program exit issues --- base/hmain.c | 10 ++++++++-- base/hmain.h | 4 +++- http/server/HttpServer.cpp | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/base/hmain.c b/base/hmain.c index 7de6c613d..42c56d4e3 100644 --- a/base/hmain.c +++ b/base/hmain.c @@ -469,7 +469,10 @@ void signal_handler(int signo) { switch (signo) { case SIGINT: case SIGNAL_TERMINATE: - hlogi("killall processes"); + hlogi("master process is about to end"); + g_main_ctx.master_wait = true; + case SIGNAL_KILLWORKER: + hlogi("kill all worker processes"); signal(SIGCHLD, SIG_IGN); // master send SIGKILL => workers for (int i = 0; i < g_main_ctx.worker_processes; ++i) { @@ -477,7 +480,8 @@ void signal_handler(int signo) { kill(g_main_ctx.proc_ctxs[i].pid, SIGKILL); g_main_ctx.proc_ctxs[i].pid = -1; } - exit(0); + g_main_ctx.worker_processes = 0; + if (g_main_ctx.master_wait) exit(0); break; case SIGCHLD: { @@ -541,6 +545,7 @@ int signal_init(procedure_t reload_fn, void* reload_userdata) { signal(SIGCHLD, signal_handler); signal(SIGNAL_TERMINATE, signal_handler); signal(SIGNAL_RELOAD, signal_handler); + signal(SIGNAL_KILLWORKER, signal_handler); return 0; } @@ -729,6 +734,7 @@ int master_workers_run(procedure_t worker_fn, void* worker_userdata, setproctitle("%s: master process", g_main_ctx.program_name); signal(SIGNAL_RELOAD, signal_handler); #endif + g_main_ctx.master_wait = wait; g_main_ctx.worker_processes = worker_processes; int bytes = g_main_ctx.worker_processes * sizeof(proc_ctx_t); SAFE_ALLOC(g_main_ctx.proc_ctxs, bytes); diff --git a/base/hmain.h b/base/hmain.h index 5c7ac7953..6cf99b981 100644 --- a/base/hmain.h +++ b/base/hmain.h @@ -45,6 +45,7 @@ typedef struct main_ctx_s { procedure_t reload_fn; void* reload_userdata; // master workers model + bool master_wait; int worker_processes; int worker_threads; procedure_t worker_fn; @@ -95,9 +96,10 @@ HV_EXPORT pid_t getpid_from_pidfile(); HV_EXPORT int signal_init(procedure_t reload_fn DEFAULT(NULL), void* reload_userdata DEFAULT(NULL)); HV_EXPORT void signal_handle(const char* signal); #ifdef OS_UNIX -// we use SIGTERM to quit process, SIGUSR1 to reload confile +// we use SIGTERM to quit all process, SIGUSR1 to reload confile, SIGUSR2 to quit worker process #define SIGNAL_TERMINATE SIGTERM #define SIGNAL_RELOAD SIGUSR1 +#define SIGNAL_KILLWORKER SIGUSR2 void signal_handler(int signo); #endif diff --git a/http/server/HttpServer.cpp b/http/server/HttpServer.cpp index eff0a865c..d9ff132d8 100644 --- a/http/server/HttpServer.cpp +++ b/http/server/HttpServer.cpp @@ -244,7 +244,7 @@ int http_server_stop(http_server_t* server) { #ifdef OS_UNIX if (server->worker_processes) { - signal_handle("stop"); + if (g_main_ctx.pid) kill(g_main_ctx.pid, SIGNAL_KILLWORKER); return 0; } #endif