1
0
mirror of https://github.com/moparisthebest/curl synced 2024-08-13 17:03:50 -04:00

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
This commit is contained in:
Marc Hoersken 2020-04-18 21:54:40 +02:00
parent 7dc8a981fa
commit 0e058776c0
No known key found for this signature in database
GPG Key ID: 61E03CBED7BC859E

View File

@ -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);