diff options
-rw-r--r-- | tests/server/util.c | 19 | ||||
-rw-r--r-- | tests/server/util.h | 5 |
2 files changed, 24 insertions, 0 deletions
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); |