aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Hoersken <info@marc-hoersken.de>2020-04-18 21:54:40 +0200
committerMarc Hoersken <info@marc-hoersken.de>2020-05-02 17:30:54 +0200
commit0e058776c02cf8ddc753a36f9cde98cc87899d51 (patch)
treec0204927e7c925ff50f002879bddf21a51d6da60
parent7dc8a981fa043b9dbbae3a632229b74dcd868bd7 (diff)
sockfilt: make select_ws stop waiting on exit signal event
This makes sure that select_ws behaves similar to real select which stops waiting on a signal handler being triggered. This makes it possible to gracefully stop sockfilt.exe on Windows with taskkill /IM sockfilt.exe (without /F force flag). Reviewed-by: Jay Satiro Part of #5260
-rw-r--r--tests/server/sockfilt.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/tests/server/sockfilt.c b/tests/server/sockfilt.c
index 84c72f960..7f0db92b4 100644
--- a/tests/server/sockfilt.c
+++ b/tests/server/sockfilt.c
@@ -676,7 +676,7 @@ static int select_ws(int nfds, fd_set *readfds, fd_set *writefds,
}
/* allocate internal array for the internal event handles */
- handles = calloc(nfds, sizeof(HANDLE));
+ handles = calloc(nfds + 1, sizeof(HANDLE));
if(handles == NULL) {
CloseHandle(abort);
CloseHandle(mutex);
@@ -785,8 +785,18 @@ static int select_ws(int nfds, fd_set *readfds, fd_set *writefds,
}
}
+ /* wait on the number of handles */
+ wait = nfd;
+
+ /* make sure we stop waiting on exit signal event */
+ if(exit_event) {
+ /* we allocated handles nfds + 1 for this */
+ handles[nfd] = exit_event;
+ wait += 1;
+ }
+
/* wait for one of the internal handles to trigger */
- wait = WaitForMultipleObjectsEx(nfd, handles, FALSE, timeout_ms, FALSE);
+ wait = WaitForMultipleObjectsEx(wait, handles, FALSE, timeout_ms, FALSE);
/* wait for internal mutex to lock event handling in threads */
WaitForSingleObjectEx(mutex, INFINITE, FALSE);