@@ -549,21 +549,22 @@ int signal_init(procedure_t reload_fn, void* reload_userdata) {
549549#include <mmsystem.h> // for timeSetEvent
550550
551551// win32 use Event
552- //static HANDLE s_hEventTerm = NULL;
552+ static HANDLE s_hEventTerm = NULL ;
553+ static HANDLE s_hEventTermWait = NULL ;
553554static HANDLE s_hEventReload = NULL ;
554555
555556static void WINAPI on_timer (UINT uTimerID , UINT uMsg , DWORD_PTR dwUser , DWORD_PTR dw1 , DWORD_PTR dw2 ) {
556557 DWORD ret ;
557- /*
558+
558559 ret = WaitForSingleObject (s_hEventTerm , 0 );
559560 if (ret == WAIT_OBJECT_0 ) {
560561 hlogi ("pid=%d recv event [TERM]" , getpid ());
561562 if (getpid_from_pidfile () == getpid ()) {
563+ SetEvent (s_hEventTermWait );
562564 timeKillEvent (uTimerID );
563565 exit (0 );
564566 }
565567 }
566- */
567568
568569 ret = WaitForSingleObject (s_hEventReload , 0 );
569570 if (ret == WAIT_OBJECT_0 ) {
@@ -575,8 +576,10 @@ static void WINAPI on_timer(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PT
575576}
576577
577578static void signal_cleanup (void ) {
578- //CloseHandle(s_hEventTerm);
579- //s_hEventTerm = NULL;
579+ CloseHandle (s_hEventTerm );
580+ s_hEventTerm = NULL ;
581+ CloseHandle (s_hEventTermWait );
582+ s_hEventTermWait = NULL ;
580583 CloseHandle (s_hEventReload );
581584 s_hEventReload = NULL ;
582585}
@@ -586,11 +589,17 @@ int signal_init(procedure_t reload_fn, void* reload_userdata) {
586589 g_main_ctx .reload_userdata = reload_userdata ;
587590
588591 char eventname [MAX_PATH ] = {0 };
589- //snprintf(eventname, sizeof(eventname), "%s_term_event", g_main_ctx.program_name);
590- //s_hEventTerm = CreateEvent(NULL, FALSE, FALSE, eventname);
591- //s_hEventTerm = OpenEvent(EVENT_ALL_ACCESS, FALSE, eventname);
592+ snprintf (eventname , sizeof (eventname ), "%s_term_event" , g_main_ctx .program_name );
593+ s_hEventTerm = CreateEvent (NULL , FALSE, FALSE, eventname );
594+ if (s_hEventTerm == NULL ) return -1 ;
595+
596+ snprintf (eventname , sizeof (eventname ), "%s_term_wait_event" , g_main_ctx .program_name );
597+ s_hEventTermWait = CreateEvent (NULL , FALSE, FALSE, eventname );
598+ if (s_hEventTermWait == NULL ) return -2 ;
599+
592600 snprintf (eventname , sizeof (eventname ), "%s_reload_event" , g_main_ctx .program_name );
593601 s_hEventReload = CreateEvent (NULL , FALSE, FALSE, eventname );
602+ if (s_hEventReload == NULL ) return -3 ;
594603
595604 timeSetEvent (1000 , 1000 , on_timer , 0 , TIME_PERIODIC );
596605
@@ -603,8 +612,8 @@ static void kill_proc(int pid) {
603612#ifdef OS_UNIX
604613 kill (pid , SIGNAL_TERMINATE );
605614#else
606- // SetEvent(s_hEventTerm);
607- //hv_sleep(1) ;
615+ SetEvent (s_hEventTerm );
616+ if ( WaitForSingleObject ( s_hEventTermWait , 2000 ) == WAIT_OBJECT_0 ) return ;
608617 HANDLE hproc = OpenProcess (PROCESS_TERMINATE , FALSE, pid );
609618 if (hproc ) {
610619 TerminateProcess (hproc , 0 );
0 commit comments