@@ -469,15 +469,19 @@ void signal_handler(int signo) {
469469 switch (signo ) {
470470 case SIGINT :
471471 case SIGNAL_TERMINATE :
472- hlogi ("killall processes" );
472+ hlogi ("master process is about to end" );
473+ g_main_ctx .master_wait = true;
474+ case SIGNAL_KILLWORKER :
475+ hlogi ("kill all worker processes" );
473476 signal (SIGCHLD , SIG_IGN );
474477 // master send SIGKILL => workers
475478 for (int i = 0 ; i < g_main_ctx .worker_processes ; ++ i ) {
476479 if (g_main_ctx .proc_ctxs [i ].pid <= 0 ) break ;
477480 kill (g_main_ctx .proc_ctxs [i ].pid , SIGKILL );
478481 g_main_ctx .proc_ctxs [i ].pid = -1 ;
479482 }
480- exit (0 );
483+ g_main_ctx .worker_processes = 0 ;
484+ if (g_main_ctx .master_wait ) exit (0 );
481485 break ;
482486 case SIGCHLD :
483487 {
@@ -541,6 +545,7 @@ int signal_init(procedure_t reload_fn, void* reload_userdata) {
541545 signal (SIGCHLD , signal_handler );
542546 signal (SIGNAL_TERMINATE , signal_handler );
543547 signal (SIGNAL_RELOAD , signal_handler );
548+ signal (SIGNAL_KILLWORKER , signal_handler );
544549
545550 return 0 ;
546551}
@@ -729,6 +734,7 @@ int master_workers_run(procedure_t worker_fn, void* worker_userdata,
729734 setproctitle ("%s: master process" , g_main_ctx .program_name );
730735 signal (SIGNAL_RELOAD , signal_handler );
731736#endif
737+ g_main_ctx .master_wait = wait ;
732738 g_main_ctx .worker_processes = worker_processes ;
733739 int bytes = g_main_ctx .worker_processes * sizeof (proc_ctx_t );
734740 SAFE_ALLOC (g_main_ctx .proc_ctxs , bytes );
0 commit comments