aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorMarc Hoersken <info@marc-hoersken.de>2020-04-18 21:51:19 +0200
committerMarc Hoersken <info@marc-hoersken.de>2020-05-02 17:29:52 +0200
commit7dc8a981fa043b9dbbae3a632229b74dcd868bd7 (patch)
treeacf333824555ebf489068faf8f21b6a06df467bc /tests
parent551577f35791be6b9423e8f606383bc1b8394c46 (diff)
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
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);