From 7dc8a981fa043b9dbbae3a632229b74dcd868bd7 Mon Sep 17 00:00:00 2001 From: Marc Hoersken Date: Sat, 18 Apr 2020 21:51:19 +0200 Subject: [PATCH] tests/server/util.[ch]: add exit event to stop waiting on Windows This commit adds a global exit event to the test servers that Windows-specific wait routines can use to get triggered if the program was signaled to be terminated, eg. select_ws in sockfilt.c The exit event will be managed by the signal handling code and is set to not reset automatically to support multiple wait routines. Reviewed-by: Jay Satiro Closes #5260 --- tests/server/util.c | 19 +++++++++++++++++++ tests/server/util.h | 5 +++++ 2 files changed, 24 insertions(+) diff --git a/tests/server/util.c b/tests/server/util.c index 68889c0dc..75f3cb1b6 100644 --- a/tests/server/util.c +++ b/tests/server/util.c @@ -580,6 +580,11 @@ volatile int got_exit_signal = 0; /* if next is set indicates the first signal handled in exit_signal_handler */ volatile int exit_signal = 0; +#ifdef WIN32 +/* event which if set indicates that the program should finish */ +HANDLE exit_event = NULL; +#endif + /* signal handler that will be triggered to indicate that the program * should finish its execution in a controlled manner as soon as possible. * The first time this is called it will set got_exit_signal to one and @@ -592,6 +597,10 @@ static RETSIGTYPE exit_signal_handler(int signum) if(got_exit_signal == 0) { got_exit_signal = 1; exit_signal = signum; +#ifdef WIN32 + if(exit_event) + (void)SetEvent(exit_event); +#endif } (void)signal(signum, exit_signal_handler); errno = old_errno; @@ -712,6 +721,12 @@ static DWORD WINAPI main_window_loop(LPVOID lpParameter) void install_signal_handlers(bool keep_sigalrm) { +#ifdef WIN32 + /* setup windows exit event before any signal can trigger */ + exit_event = CreateEvent(NULL, TRUE, FALSE, NULL); + if(!exit_event) + logmsg("cannot create exit event"); +#endif #ifdef SIGHUP /* ignore SIGHUP signal */ old_sighup_handler = signal(SIGHUP, SIG_IGN); @@ -812,6 +827,10 @@ void restore_signal_handlers(bool keep_sigalrm) } } } + if(exit_event) { + if(CloseHandle(exit_event)) { + exit_event = NULL; + } } #endif } diff --git a/tests/server/util.h b/tests/server/util.h index 73f5f45f6..b64c1d5a7 100644 --- a/tests/server/util.h +++ b/tests/server/util.h @@ -70,6 +70,11 @@ extern volatile int got_exit_signal; /* global variable which if set indicates the first signal handled */ extern volatile int exit_signal; +#ifdef WIN32 +/* global event which if set indicates that the program should finish */ +extern HANDLE exit_event; +#endif + void install_signal_handlers(bool keep_sigalrm); void restore_signal_handlers(bool keep_sigalrm);