diff --git a/src/win/poll.c b/src/win/poll.c index f5e271f3..55e0b27e 100644 --- a/src/win/poll.c +++ b/src/win/poll.c @@ -94,7 +94,7 @@ static void uv__fast_poll_submit_poll_req(uv_loop_t* loop, uv_poll_t* handle) { } -static int uv__fast_poll_cancel_poll_reqs(uv_loop_t* loop, uv_poll_t* handle) { +static int uv__fast_poll_cancel_poll_req(uv_loop_t* loop, uv_poll_t* handle) { AFD_POLL_INFO afd_poll_info; DWORD result; HANDLE event; @@ -106,15 +106,15 @@ static int uv__fast_poll_cancel_poll_reqs(uv_loop_t* loop, uv_poll_t* handle) { return -1; } - afd_poll_info.Exclusive = TRUE; + afd_poll_info.Exclusive = FALSE; afd_poll_info.NumberOfHandles = 1; - afd_poll_info.Timeout.QuadPart = INT64_MAX; + afd_poll_info.Timeout.QuadPart = 0; afd_poll_info.Handles[0].Handle = (HANDLE) handle->socket; afd_poll_info.Handles[0].Status = 0; afd_poll_info.Handles[0].Events = AFD_POLL_ALL; memset(&overlapped, 0, sizeof overlapped); - overlapped.hEvent = (HANDLE) ((uintptr_t) event & 1); + overlapped.hEvent = (HANDLE) ((uintptr_t) event | 1); result = uv_msafd_poll(handle->socket, &afd_poll_info, @@ -129,6 +129,10 @@ static int uv__fast_poll_cancel_poll_reqs(uv_loop_t* loop, uv_poll_t* handle) { } } + if (WaitForSingleObject(event, INFINITE) != WAIT_OBJECT_0) { + uv_fatal_error(GetLastError(), "WaitForSingleObject"); + } + CloseHandle(event); return 0; } @@ -234,7 +238,7 @@ static void uv__fast_poll_close(uv_loop_t* loop, uv_poll_t* handle) { pCancelIoEx((HANDLE) handle->socket, &handle->poll_req_2.overlapped); } else if (handle->submitted_events_1 | handle->submitted_events_2) { /* Execute another unique poll to force the others to return. */ - uv__fast_poll_cancel_poll_reqs(loop, handle); + uv__fast_poll_cancel_poll_req(loop, handle); } } }