Skip to content

Commit c9f07f9

Browse files
authored
support windows stop signal atexit callback (#723)
1 parent 03e5eb1 commit c9f07f9

File tree

1 file changed

+19
-10
lines changed

1 file changed

+19
-10
lines changed

base/hmain.c

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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;
553554
static HANDLE s_hEventReload = NULL;
554555

555556
static 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

577578
static 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

Comments
 (0)