1818static FILE * s_fp = NULL ;
1919
2020main_ctx_t g_main_ctx ;
21+ printf_t printf_fn = printf ;
2122
2223static void init_arg_kv (int maxsize ) {
2324 g_main_ctx .arg_kv_size = 0 ;
@@ -238,7 +239,7 @@ int parse_opt(int argc, char** argv, const char* options) {
238239 while (* ++ p ) {
239240 int arg_type = get_arg_type (* p , options );
240241 if (arg_type == UNDEFINED_OPTION ) {
241- printf ("Invalid option '%c'\n" , * p );
242+ printf_fn ("Invalid option '%c'\n" , * p );
242243 return -20 ;
243244 } else if (arg_type == NO_ARGUMENT ) {
244245 save_arg_kv (p , 1 , OPTION_ENABLE , 0 );
@@ -251,7 +252,7 @@ int parse_opt(int argc, char** argv, const char* options) {
251252 save_arg_kv (p , 1 , argv [++ i ], 0 );
252253 break ;
253254 } else {
254- printf ("Option '%c' requires param\n" , * p );
255+ printf_fn ("Option '%c' requires param\n" , * p );
255256 return -30 ;
256257 }
257258 }
@@ -309,7 +310,7 @@ int parse_opt_long(int argc, char** argv, const option_t* long_options, int size
309310 char * delim = strchr (arg , OPTION_DELIM );
310311 if (delim ) {
311312 if (delim == arg || delim == arg + arg_len - 1 || delim - arg > MAX_OPTION ) {
312- printf ("Invalid option '%s'\n" , argv [i ]);
313+ printf_fn ("Invalid option '%s'\n" , argv [i ]);
313314 return -10 ;
314315 }
315316 memcpy (opt , arg , delim - arg );
@@ -329,7 +330,7 @@ int parse_opt_long(int argc, char** argv, const option_t* long_options, int size
329330 save_arg_list (arg );
330331 continue ;
331332 } else {
332- printf ("Invalid option: '%s'\n" , argv [i ]);
333+ printf_fn ("Invalid option: '%s'\n" , argv [i ]);
333334 return -10 ;
334335 }
335336 }
@@ -349,7 +350,7 @@ int parse_opt_long(int argc, char** argv, const option_t* long_options, int size
349350 // --port 80
350351 value = argv [++ i ];
351352 } else if (pOption -> arg_type == REQUIRED_ARGUMENT ) {
352- printf ("Option '%s' requires parament\n" , opt );
353+ printf_fn ("Option '%s' requires parament\n" , opt );
353354 return -20 ;
354355 } else {
355356 // arg_type == OPTIONAL_ARGUMENT
@@ -586,21 +587,22 @@ int signal_init(procedure_t reload_fn, void* reload_userdata) {
586587#include <mmsystem.h> // for timeSetEvent
587588
588589// win32 use Event
589- //static HANDLE s_hEventTerm = NULL;
590+ static HANDLE s_hEventTerm = NULL ;
591+ static HANDLE s_hEventTermWait = NULL ;
590592static HANDLE s_hEventReload = NULL ;
591593
592594static void WINAPI on_timer (UINT uTimerID , UINT uMsg , DWORD_PTR dwUser , DWORD_PTR dw1 , DWORD_PTR dw2 ) {
593595 DWORD ret ;
594- /*
596+
595597 ret = WaitForSingleObject (s_hEventTerm , 0 );
596598 if (ret == WAIT_OBJECT_0 ) {
597599 hlogi ("pid=%d recv event [TERM]" , getpid ());
598600 if (getpid_from_pidfile () == getpid ()) {
601+ SetEvent (s_hEventTermWait );
599602 timeKillEvent (uTimerID );
600603 exit (0 );
601604 }
602605 }
603- */
604606
605607 ret = WaitForSingleObject (s_hEventReload , 0 );
606608 if (ret == WAIT_OBJECT_0 ) {
@@ -612,8 +614,10 @@ static void WINAPI on_timer(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PT
612614}
613615
614616static void signal_cleanup (void ) {
615- //CloseHandle(s_hEventTerm);
616- //s_hEventTerm = NULL;
617+ CloseHandle (s_hEventTerm );
618+ s_hEventTerm = NULL ;
619+ CloseHandle (s_hEventTermWait );
620+ s_hEventTermWait = NULL ;
617621 CloseHandle (s_hEventReload );
618622 s_hEventReload = NULL ;
619623}
@@ -623,11 +627,17 @@ int signal_init(procedure_t reload_fn, void* reload_userdata) {
623627 g_main_ctx .reload_userdata = reload_userdata ;
624628
625629 char eventname [MAX_PATH ] = {0 };
626- //snprintf(eventname, sizeof(eventname), "%s_term_event", g_main_ctx.program_name);
627- //s_hEventTerm = CreateEvent(NULL, FALSE, FALSE, eventname);
628- //s_hEventTerm = OpenEvent(EVENT_ALL_ACCESS, FALSE, eventname);
630+ snprintf (eventname , sizeof (eventname ), "%s_term_event" , g_main_ctx .program_name );
631+ s_hEventTerm = CreateEvent (NULL , FALSE, FALSE, eventname );
632+ if (s_hEventTerm == NULL ) return -1 ;
633+
634+ snprintf (eventname , sizeof (eventname ), "%s_term_wait_event" , g_main_ctx .program_name );
635+ s_hEventTermWait = CreateEvent (NULL , FALSE, FALSE, eventname );
636+ if (s_hEventTermWait == NULL ) return -2 ;
637+
629638 snprintf (eventname , sizeof (eventname ), "%s_reload_event" , g_main_ctx .program_name );
630639 s_hEventReload = CreateEvent (NULL , FALSE, FALSE, eventname );
640+ if (s_hEventReload == NULL ) return -3 ;
631641
632642 timeSetEvent (1000 , 1000 , on_timer , 0 , TIME_PERIODIC );
633643
@@ -640,8 +650,8 @@ static void kill_proc(int pid) {
640650#ifdef OS_UNIX
641651 kill (pid , SIGNAL_TERMINATE );
642652#else
643- // SetEvent(s_hEventTerm);
644- //hv_sleep(1) ;
653+ SetEvent (s_hEventTerm );
654+ if ( WaitForSingleObject ( s_hEventTermWait , 2000 ) == WAIT_OBJECT_0 ) return ;
645655 HANDLE hproc = OpenProcess (PROCESS_TERMINATE , FALSE, pid );
646656 if (hproc ) {
647657 TerminateProcess (hproc , 0 );
@@ -651,50 +661,55 @@ static void kill_proc(int pid) {
651661}
652662
653663void signal_handle (const char * signal ) {
664+ if (signal_handle_noexit (signal )) exit (0 );
665+ }
666+
667+ bool signal_handle_noexit (const char * signal ) {
654668 if (strcmp (signal , "start" ) == 0 ) {
655669 if (g_main_ctx .oldpid > 0 ) {
656- printf ("%s is already running, pid=%d\n" , g_main_ctx .program_name , g_main_ctx .oldpid );
657- exit ( 0 ) ;
670+ printf_fn ("%s is already running, pid=%d\n" , g_main_ctx .program_name , g_main_ctx .oldpid );
671+ return true ;
658672 }
659673 } else if (strcmp (signal , "stop" ) == 0 ) {
660674 if (g_main_ctx .oldpid > 0 ) {
661675 kill_proc (g_main_ctx .oldpid );
662- printf ("%s stop/waiting\n" , g_main_ctx .program_name );
676+ printf_fn ("%s stop/waiting\n" , g_main_ctx .program_name );
663677 } else {
664- printf ("%s is already stopped\n" , g_main_ctx .program_name );
678+ printf_fn ("%s is already stopped\n" , g_main_ctx .program_name );
665679 }
666- exit ( 0 ) ;
680+ return true ;
667681 } else if (strcmp (signal , "restart" ) == 0 ) {
668682 if (g_main_ctx .oldpid > 0 ) {
669683 kill_proc (g_main_ctx .oldpid );
670- printf ("%s stop/waiting\n" , g_main_ctx .program_name );
684+ printf_fn ("%s stop/waiting\n" , g_main_ctx .program_name );
671685 hv_sleep (1 );
672686 }
673687 } else if (strcmp (signal , "status" ) == 0 ) {
674688 if (g_main_ctx .oldpid > 0 ) {
675- printf ("%s start/running, pid=%d\n" , g_main_ctx .program_name , g_main_ctx .oldpid );
689+ printf_fn ("%s start/running, pid=%d\n" , g_main_ctx .program_name , g_main_ctx .oldpid );
676690 } else {
677- printf ("%s is already stopped\n" , g_main_ctx .program_name );
691+ printf_fn ("%s is already stopped\n" , g_main_ctx .program_name );
678692 }
679- exit ( 0 ) ;
693+ return true ;
680694 } else if (strcmp (signal , "reload" ) == 0 ) {
681695 if (g_main_ctx .oldpid > 0 ) {
682- printf ("reload confile [%s]\n" , g_main_ctx .confile );
696+ printf_fn ("reload confile [%s]\n" , g_main_ctx .confile );
683697#ifdef OS_UNIX
684698 kill (g_main_ctx .oldpid , SIGNAL_RELOAD );
685699#else
686700 SetEvent (s_hEventReload );
687701#endif
688702 hv_sleep (1 );
689703 } else {
690- printf ("%s is already stopped\n" , g_main_ctx .program_name );
704+ printf_fn ("%s is already stopped\n" , g_main_ctx .program_name );
691705 }
692- exit ( 0 ) ;
706+ return true ;
693707 } else {
694- printf ("Invalid signal: '%s'\n" , signal );
695- exit ( 0 ) ;
708+ printf_fn ("Invalid signal: '%s'\n" , signal );
709+ return true ;
696710 }
697- printf ("%s start/running\n" , g_main_ctx .program_name );
711+ printf_fn ("%s start/running\n" , g_main_ctx .program_name );
712+ return false;
698713}
699714
700715// master-workers processes
0 commit comments