win: DRY uv_poll_close()
PR-URL: https://github.com/libuv/libuv/pull/2746 Reviewed-By: Bartosz Sosnowski <bartosz@janeasystems.com> Reviewed-By: erw7 <erw7.github@gmail.com>
This commit is contained in:
parent
887cf62c32
commit
b29612fe59
@ -134,32 +134,6 @@ static void uv__fast_poll_submit_poll_req(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;
|
|
||||||
int result;
|
|
||||||
|
|
||||||
afd_poll_info.Exclusive = TRUE;
|
|
||||||
afd_poll_info.NumberOfHandles = 1;
|
|
||||||
afd_poll_info.Timeout.QuadPart = INT64_MAX;
|
|
||||||
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;
|
|
||||||
|
|
||||||
result = uv_msafd_poll(handle->socket,
|
|
||||||
&afd_poll_info,
|
|
||||||
uv__get_afd_poll_info_dummy(),
|
|
||||||
uv__get_overlapped_dummy());
|
|
||||||
|
|
||||||
if (result == SOCKET_ERROR) {
|
|
||||||
DWORD error = WSAGetLastError();
|
|
||||||
if (error != WSA_IO_PENDING)
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void uv__fast_poll_process_poll_req(uv_loop_t* loop, uv_poll_t* handle,
|
static void uv__fast_poll_process_poll_req(uv_loop_t* loop, uv_poll_t* handle,
|
||||||
uv_req_t* req) {
|
uv_req_t* req) {
|
||||||
unsigned char mask_events;
|
unsigned char mask_events;
|
||||||
@ -226,22 +200,6 @@ static void uv__fast_poll_process_poll_req(uv_loop_t* loop, uv_poll_t* handle,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int uv__fast_poll_close(uv_loop_t* loop, uv_poll_t* handle) {
|
|
||||||
handle->events = 0;
|
|
||||||
uv__handle_closing(handle);
|
|
||||||
|
|
||||||
if (handle->submitted_events_1 == 0 &&
|
|
||||||
handle->submitted_events_2 == 0) {
|
|
||||||
uv_want_endgame(loop, (uv_handle_t*) handle);
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
/* Cancel outstanding poll requests by executing another, unique poll
|
|
||||||
* request that forces the outstanding ones to return. */
|
|
||||||
return uv__fast_poll_cancel_poll_req(loop, handle);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static SOCKET uv__fast_poll_create_peer_socket(HANDLE iocp,
|
static SOCKET uv__fast_poll_create_peer_socket(HANDLE iocp,
|
||||||
WSAPROTOCOL_INFOW* protocol_info) {
|
WSAPROTOCOL_INFOW* protocol_info) {
|
||||||
SOCKET sock = 0;
|
SOCKET sock = 0;
|
||||||
@ -447,19 +405,6 @@ static void uv__slow_poll_process_poll_req(uv_loop_t* loop, uv_poll_t* handle,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int uv__slow_poll_close(uv_loop_t* loop, uv_poll_t* handle) {
|
|
||||||
handle->events = 0;
|
|
||||||
uv__handle_closing(handle);
|
|
||||||
|
|
||||||
if (handle->submitted_events_1 == 0 &&
|
|
||||||
handle->submitted_events_2 == 0) {
|
|
||||||
uv_want_endgame(loop, (uv_handle_t*) handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int uv_poll_init(uv_loop_t* loop, uv_poll_t* handle, int fd) {
|
int uv_poll_init(uv_loop_t* loop, uv_poll_t* handle, int fd) {
|
||||||
return uv_poll_init_socket(loop, handle, (SOCKET) uv__get_osfhandle(fd));
|
return uv_poll_init_socket(loop, handle, (SOCKET) uv__get_osfhandle(fd));
|
||||||
}
|
}
|
||||||
@ -588,11 +533,43 @@ void uv_process_poll_req(uv_loop_t* loop, uv_poll_t* handle, uv_req_t* req) {
|
|||||||
|
|
||||||
|
|
||||||
int uv_poll_close(uv_loop_t* loop, uv_poll_t* handle) {
|
int uv_poll_close(uv_loop_t* loop, uv_poll_t* handle) {
|
||||||
if (!(handle->flags & UV_HANDLE_POLL_SLOW)) {
|
AFD_POLL_INFO afd_poll_info;
|
||||||
return uv__fast_poll_close(loop, handle);
|
DWORD error;
|
||||||
} else {
|
int result;
|
||||||
return uv__slow_poll_close(loop, handle);
|
|
||||||
|
handle->events = 0;
|
||||||
|
uv__handle_closing(handle);
|
||||||
|
|
||||||
|
if (handle->submitted_events_1 == 0 &&
|
||||||
|
handle->submitted_events_2 == 0) {
|
||||||
|
uv_want_endgame(loop, (uv_handle_t*) handle);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (handle->flags & UV_HANDLE_POLL_SLOW)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Cancel outstanding poll requests by executing another, unique poll
|
||||||
|
* request that forces the outstanding ones to return. */
|
||||||
|
afd_poll_info.Exclusive = TRUE;
|
||||||
|
afd_poll_info.NumberOfHandles = 1;
|
||||||
|
afd_poll_info.Timeout.QuadPart = INT64_MAX;
|
||||||
|
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;
|
||||||
|
|
||||||
|
result = uv_msafd_poll(handle->socket,
|
||||||
|
&afd_poll_info,
|
||||||
|
uv__get_afd_poll_info_dummy(),
|
||||||
|
uv__get_overlapped_dummy());
|
||||||
|
|
||||||
|
if (result == SOCKET_ERROR) {
|
||||||
|
error = WSAGetLastError();
|
||||||
|
if (error != WSA_IO_PENDING)
|
||||||
|
return uv_translate_sys_error(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user