18
18
static FILE * s_fp = NULL ;
19
19
20
20
main_ctx_t g_main_ctx ;
21
+ printf_t printf_fn = printf ;
21
22
22
23
static void init_arg_kv (int maxsize ) {
23
24
g_main_ctx .arg_kv_size = 0 ;
@@ -238,7 +239,7 @@ int parse_opt(int argc, char** argv, const char* options) {
238
239
while (* ++ p ) {
239
240
int arg_type = get_arg_type (* p , options );
240
241
if (arg_type == UNDEFINED_OPTION ) {
241
- printf ("Invalid option '%c'\n" , * p );
242
+ printf_fn ("Invalid option '%c'\n" , * p );
242
243
return -20 ;
243
244
} else if (arg_type == NO_ARGUMENT ) {
244
245
save_arg_kv (p , 1 , OPTION_ENABLE , 0 );
@@ -251,7 +252,7 @@ int parse_opt(int argc, char** argv, const char* options) {
251
252
save_arg_kv (p , 1 , argv [++ i ], 0 );
252
253
break ;
253
254
} else {
254
- printf ("Option '%c' requires param\n" , * p );
255
+ printf_fn ("Option '%c' requires param\n" , * p );
255
256
return -30 ;
256
257
}
257
258
}
@@ -309,7 +310,7 @@ int parse_opt_long(int argc, char** argv, const option_t* long_options, int size
309
310
char * delim = strchr (arg , OPTION_DELIM );
310
311
if (delim ) {
311
312
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 ]);
313
314
return -10 ;
314
315
}
315
316
memcpy (opt , arg , delim - arg );
@@ -329,7 +330,7 @@ int parse_opt_long(int argc, char** argv, const option_t* long_options, int size
329
330
save_arg_list (arg );
330
331
continue ;
331
332
} else {
332
- printf ("Invalid option: '%s'\n" , argv [i ]);
333
+ printf_fn ("Invalid option: '%s'\n" , argv [i ]);
333
334
return -10 ;
334
335
}
335
336
}
@@ -349,7 +350,7 @@ int parse_opt_long(int argc, char** argv, const option_t* long_options, int size
349
350
// --port 80
350
351
value = argv [++ i ];
351
352
} else if (pOption -> arg_type == REQUIRED_ARGUMENT ) {
352
- printf ("Option '%s' requires parament\n" , opt );
353
+ printf_fn ("Option '%s' requires parament\n" , opt );
353
354
return -20 ;
354
355
} else {
355
356
// arg_type == OPTIONAL_ARGUMENT
@@ -586,21 +587,22 @@ int signal_init(procedure_t reload_fn, void* reload_userdata) {
586
587
#include <mmsystem.h> // for timeSetEvent
587
588
588
589
// win32 use Event
589
- //static HANDLE s_hEventTerm = NULL;
590
+ static HANDLE s_hEventTerm = NULL ;
591
+ static HANDLE s_hEventTermWait = NULL ;
590
592
static HANDLE s_hEventReload = NULL ;
591
593
592
594
static void WINAPI on_timer (UINT uTimerID , UINT uMsg , DWORD_PTR dwUser , DWORD_PTR dw1 , DWORD_PTR dw2 ) {
593
595
DWORD ret ;
594
- /*
596
+
595
597
ret = WaitForSingleObject (s_hEventTerm , 0 );
596
598
if (ret == WAIT_OBJECT_0 ) {
597
599
hlogi ("pid=%d recv event [TERM]" , getpid ());
598
600
if (getpid_from_pidfile () == getpid ()) {
601
+ SetEvent (s_hEventTermWait );
599
602
timeKillEvent (uTimerID );
600
603
exit (0 );
601
604
}
602
605
}
603
- */
604
606
605
607
ret = WaitForSingleObject (s_hEventReload , 0 );
606
608
if (ret == WAIT_OBJECT_0 ) {
@@ -612,8 +614,10 @@ static void WINAPI on_timer(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PT
612
614
}
613
615
614
616
static 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 ;
617
621
CloseHandle (s_hEventReload );
618
622
s_hEventReload = NULL ;
619
623
}
@@ -623,11 +627,17 @@ int signal_init(procedure_t reload_fn, void* reload_userdata) {
623
627
g_main_ctx .reload_userdata = reload_userdata ;
624
628
625
629
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
+
629
638
snprintf (eventname , sizeof (eventname ), "%s_reload_event" , g_main_ctx .program_name );
630
639
s_hEventReload = CreateEvent (NULL , FALSE, FALSE, eventname );
640
+ if (s_hEventReload == NULL ) return -3 ;
631
641
632
642
timeSetEvent (1000 , 1000 , on_timer , 0 , TIME_PERIODIC );
633
643
@@ -640,8 +650,8 @@ static void kill_proc(int pid) {
640
650
#ifdef OS_UNIX
641
651
kill (pid , SIGNAL_TERMINATE );
642
652
#else
643
- // SetEvent(s_hEventTerm);
644
- //hv_sleep(1) ;
653
+ SetEvent (s_hEventTerm );
654
+ if ( WaitForSingleObject ( s_hEventTermWait , 2000 ) == WAIT_OBJECT_0 ) return ;
645
655
HANDLE hproc = OpenProcess (PROCESS_TERMINATE , FALSE, pid );
646
656
if (hproc ) {
647
657
TerminateProcess (hproc , 0 );
@@ -651,50 +661,55 @@ static void kill_proc(int pid) {
651
661
}
652
662
653
663
void signal_handle (const char * signal ) {
664
+ if (signal_handle_noexit (signal )) exit (0 );
665
+ }
666
+
667
+ bool signal_handle_noexit (const char * signal ) {
654
668
if (strcmp (signal , "start" ) == 0 ) {
655
669
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 ;
658
672
}
659
673
} else if (strcmp (signal , "stop" ) == 0 ) {
660
674
if (g_main_ctx .oldpid > 0 ) {
661
675
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 );
663
677
} 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 );
665
679
}
666
- exit ( 0 ) ;
680
+ return true ;
667
681
} else if (strcmp (signal , "restart" ) == 0 ) {
668
682
if (g_main_ctx .oldpid > 0 ) {
669
683
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 );
671
685
hv_sleep (1 );
672
686
}
673
687
} else if (strcmp (signal , "status" ) == 0 ) {
674
688
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 );
676
690
} 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 );
678
692
}
679
- exit ( 0 ) ;
693
+ return true ;
680
694
} else if (strcmp (signal , "reload" ) == 0 ) {
681
695
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 );
683
697
#ifdef OS_UNIX
684
698
kill (g_main_ctx .oldpid , SIGNAL_RELOAD );
685
699
#else
686
700
SetEvent (s_hEventReload );
687
701
#endif
688
702
hv_sleep (1 );
689
703
} 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 );
691
705
}
692
- exit ( 0 ) ;
706
+ return true ;
693
707
} else {
694
- printf ("Invalid signal: '%s'\n" , signal );
695
- exit ( 0 ) ;
708
+ printf_fn ("Invalid signal: '%s'\n" , signal );
709
+ return true ;
696
710
}
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;
698
713
}
699
714
700
715
// master-workers processes
0 commit comments