23 #ifdef GRPC_WINSOCK_SOCKET
40 static ULONG g_iocp_kick_token;
41 static OVERLAPPED g_iocp_custom_overlap;
43 static gpr_atm g_custom_events = 0;
52 if (deadline <
now)
return 0;
55 return static_cast<DWORD
>(
timeout.millis());
62 ULONG_PTR completion_key;
63 LPOVERLAPPED overlapped;
65 grpc_winsocket_callback_info* info;
68 GetQueuedCompletionStatus(g_iocp, &
bytes, &completion_key, &overlapped,
69 deadline_to_millis_timeout(deadline));
71 if (success == 0 && overlapped == NULL) {
72 return GRPC_IOCP_WORK_TIMEOUT;
75 if (overlapped == &g_iocp_custom_overlap) {
77 if (completion_key == (ULONG_PTR)&g_iocp_kick_token) {
79 return GRPC_IOCP_WORK_KICK;
85 socket = (grpc_winsocket*)completion_key;
86 if (overlapped == &
socket->write_info.overlapped) {
87 info = &
socket->write_info;
88 }
else if (overlapped == &
socket->read_info.overlapped) {
93 if (
socket->shutdown_called) {
94 info->bytes_transferred = 0;
95 info->wsa_error = WSA_OPERATION_ABORTED;
97 success = WSAGetOverlappedResult(
socket->socket, &info->overlapped, &
bytes,
99 info->bytes_transferred =
bytes;
100 info->wsa_error = success ? 0 : WSAGetLastError();
103 grpc_socket_become_ready(
socket, info);
104 return GRPC_IOCP_WORK_WORK;
107 void grpc_iocp_init(
void) {
113 void grpc_iocp_kick(
void) {
117 success = PostQueuedCompletionStatus(g_iocp, 0, (ULONG_PTR)&g_iocp_kick_token,
118 &g_iocp_custom_overlap);
122 void grpc_iocp_flush(
void) {
124 grpc_iocp_work_status work_status;
128 }
while (work_status == GRPC_IOCP_WORK_KICK ||
132 void grpc_iocp_shutdown(
void) {
142 void grpc_iocp_add_socket(grpc_winsocket*
socket) {
144 if (
socket->added_to_iocp)
return;
145 ret = CreateIoCompletionPort((HANDLE)
socket->socket, g_iocp,
154 socket->added_to_iocp = 1;