diff options
author | Marc Hoersken <info@marc-hoersken.de> | 2020-04-18 21:54:40 +0200 |
---|---|---|
committer | Marc Hoersken <info@marc-hoersken.de> | 2020-05-02 17:30:54 +0200 |
commit | 0e058776c02cf8ddc753a36f9cde98cc87899d51 (patch) | |
tree | c0204927e7c925ff50f002879bddf21a51d6da60 /tests | |
parent | 7dc8a981fa043b9dbbae3a632229b74dcd868bd7 (diff) | |
download | curl-0e058776c02cf8ddc753a36f9cde98cc87899d51.tar.gz |
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
Diffstat (limited to 'tests')
-rw-r--r-- | tests/server/sockfilt.c | 14 |
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); |