aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/server/util.c19
-rw-r--r--tests/server/util.h5
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);