diff options
Diffstat (limited to 'src/core/iomgr/iocp_windows.c')
-rw-r--r-- | src/core/iomgr/iocp_windows.c | 216 |
1 files changed, 95 insertions, 121 deletions
diff --git a/src/core/iomgr/iocp_windows.c b/src/core/iomgr/iocp_windows.c index d934e638ac..54048910a2 100644 --- a/src/core/iomgr/iocp_windows.c +++ b/src/core/iomgr/iocp_windows.c @@ -56,9 +56,7 @@ static gpr_atm g_custom_events = 0; static HANDLE g_iocp; -static void -do_iocp_work () -{ +static void do_iocp_work() { BOOL success; DWORD bytes = 0; DWORD flags = 0; @@ -66,159 +64,135 @@ do_iocp_work () LPOVERLAPPED overlapped; grpc_winsocket *socket; grpc_winsocket_callback_info *info; - void (*f) (void *, int) = NULL; + void (*f)(void *, int) = NULL; void *opaque = NULL; - success = GetQueuedCompletionStatus (g_iocp, &bytes, &completion_key, &overlapped, INFINITE); + success = GetQueuedCompletionStatus(g_iocp, &bytes, &completion_key, + &overlapped, INFINITE); /* success = 0 and overlapped = NULL means the deadline got attained. Which is impossible. since our wait time is +inf */ - GPR_ASSERT (success || overlapped); - GPR_ASSERT (completion_key && overlapped); - if (overlapped == &g_iocp_custom_overlap) - { - gpr_atm_full_fetch_add (&g_custom_events, -1); - if (completion_key == (ULONG_PTR) & g_iocp_kick_token) - { - /* We were awoken from a kick. */ - return; - } - gpr_log (GPR_ERROR, "Unknown custom completion key."); - abort (); + GPR_ASSERT(success || overlapped); + GPR_ASSERT(completion_key && overlapped); + if (overlapped == &g_iocp_custom_overlap) { + gpr_atm_full_fetch_add(&g_custom_events, -1); + if (completion_key == (ULONG_PTR)&g_iocp_kick_token) { + /* We were awoken from a kick. */ + return; } - - socket = (grpc_winsocket *) completion_key; - if (overlapped == &socket->write_info.overlapped) - { - info = &socket->write_info; - } - else if (overlapped == &socket->read_info.overlapped) - { - info = &socket->read_info; - } - else - { - gpr_log (GPR_ERROR, "Unknown IOCP operation"); - abort (); - } - success = WSAGetOverlappedResult (socket->socket, &info->overlapped, &bytes, FALSE, &flags); + gpr_log(GPR_ERROR, "Unknown custom completion key."); + abort(); + } + + socket = (grpc_winsocket *)completion_key; + if (overlapped == &socket->write_info.overlapped) { + info = &socket->write_info; + } else if (overlapped == &socket->read_info.overlapped) { + info = &socket->read_info; + } else { + gpr_log(GPR_ERROR, "Unknown IOCP operation"); + abort(); + } + success = WSAGetOverlappedResult(socket->socket, &info->overlapped, &bytes, + FALSE, &flags); info->bytes_transfered = bytes; - info->wsa_error = success ? 0 : WSAGetLastError (); - GPR_ASSERT (overlapped == &info->overlapped); - GPR_ASSERT (!info->has_pending_iocp); - gpr_mu_lock (&socket->state_mu); - if (info->cb) - { - f = info->cb; - opaque = info->opaque; - info->cb = NULL; - } - else - { - info->has_pending_iocp = 1; - } - gpr_mu_unlock (&socket->state_mu); - if (f) - f (opaque, 1); + info->wsa_error = success ? 0 : WSAGetLastError(); + GPR_ASSERT(overlapped == &info->overlapped); + GPR_ASSERT(!info->has_pending_iocp); + gpr_mu_lock(&socket->state_mu); + if (info->cb) { + f = info->cb; + opaque = info->opaque; + info->cb = NULL; + } else { + info->has_pending_iocp = 1; + } + gpr_mu_unlock(&socket->state_mu); + if (f) f(opaque, 1); } -static void -iocp_loop (void *p) -{ - while (gpr_atm_acq_load (&g_custom_events) || !gpr_event_get (&g_shutdown_iocp)) - { - do_iocp_work (); - } +static void iocp_loop(void *p) { + while (gpr_atm_acq_load(&g_custom_events) || + !gpr_event_get(&g_shutdown_iocp)) { + do_iocp_work(); + } - gpr_event_set (&g_iocp_done, (void *) 1); + gpr_event_set(&g_iocp_done, (void *)1); } -void -grpc_iocp_init (void) -{ +void grpc_iocp_init(void) { gpr_thd_id id; - g_iocp = CreateIoCompletionPort (INVALID_HANDLE_VALUE, NULL, (ULONG_PTR) NULL, 0); - GPR_ASSERT (g_iocp); + g_iocp = + CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, (ULONG_PTR)NULL, 0); + GPR_ASSERT(g_iocp); - gpr_event_init (&g_iocp_done); - gpr_event_init (&g_shutdown_iocp); - gpr_thd_new (&id, iocp_loop, NULL, NULL); + gpr_event_init(&g_iocp_done); + gpr_event_init(&g_shutdown_iocp); + gpr_thd_new(&id, iocp_loop, NULL, NULL); } -void -grpc_iocp_kick (void) -{ +void grpc_iocp_kick(void) { BOOL success; - gpr_atm_full_fetch_add (&g_custom_events, 1); - success = PostQueuedCompletionStatus (g_iocp, 0, (ULONG_PTR) & g_iocp_kick_token, &g_iocp_custom_overlap); - GPR_ASSERT (success); + gpr_atm_full_fetch_add(&g_custom_events, 1); + success = PostQueuedCompletionStatus(g_iocp, 0, (ULONG_PTR)&g_iocp_kick_token, + &g_iocp_custom_overlap); + GPR_ASSERT(success); } -void -grpc_iocp_shutdown (void) -{ +void grpc_iocp_shutdown(void) { BOOL success; - gpr_event_set (&g_shutdown_iocp, (void *) 1); - grpc_iocp_kick (); - gpr_event_wait (&g_iocp_done, gpr_inf_future (GPR_CLOCK_REALTIME)); - success = CloseHandle (g_iocp); - GPR_ASSERT (success); + gpr_event_set(&g_shutdown_iocp, (void *)1); + grpc_iocp_kick(); + gpr_event_wait(&g_iocp_done, gpr_inf_future(GPR_CLOCK_REALTIME)); + success = CloseHandle(g_iocp); + GPR_ASSERT(success); } -void -grpc_iocp_add_socket (grpc_winsocket * socket) -{ +void grpc_iocp_add_socket(grpc_winsocket *socket) { HANDLE ret; - if (socket->added_to_iocp) - return; - ret = CreateIoCompletionPort ((HANDLE) socket->socket, g_iocp, (gpr_uintptr) socket, 0); - if (!ret) - { - char *utf8_message = gpr_format_message (WSAGetLastError ()); - gpr_log (GPR_ERROR, "Unable to add socket to iocp: %s", utf8_message); - gpr_free (utf8_message); - __debugbreak (); - abort (); - } + if (socket->added_to_iocp) return; + ret = CreateIoCompletionPort((HANDLE)socket->socket, g_iocp, + (gpr_uintptr)socket, 0); + if (!ret) { + char *utf8_message = gpr_format_message(WSAGetLastError()); + gpr_log(GPR_ERROR, "Unable to add socket to iocp: %s", utf8_message); + gpr_free(utf8_message); + __debugbreak(); + abort(); + } socket->added_to_iocp = 1; - GPR_ASSERT (ret == g_iocp); + GPR_ASSERT(ret == g_iocp); } /* Calling notify_on_read or write means either of two things: -) The IOCP already completed in the background, and we need to call the callback now. -) The IOCP hasn't completed yet, and we're queuing it for later. */ -static void -socket_notify_on_iocp (grpc_winsocket * socket, void (*cb) (void *, int), void *opaque, grpc_winsocket_callback_info * info) -{ +static void socket_notify_on_iocp(grpc_winsocket *socket, + void (*cb)(void *, int), void *opaque, + grpc_winsocket_callback_info *info) { int run_now = 0; - GPR_ASSERT (!info->cb); - gpr_mu_lock (&socket->state_mu); - if (info->has_pending_iocp) - { - run_now = 1; - info->has_pending_iocp = 0; - } - else - { - info->cb = cb; - info->opaque = opaque; - } - gpr_mu_unlock (&socket->state_mu); - if (run_now) - cb (opaque, 1); + GPR_ASSERT(!info->cb); + gpr_mu_lock(&socket->state_mu); + if (info->has_pending_iocp) { + run_now = 1; + info->has_pending_iocp = 0; + } else { + info->cb = cb; + info->opaque = opaque; + } + gpr_mu_unlock(&socket->state_mu); + if (run_now) cb(opaque, 1); } -void -grpc_socket_notify_on_write (grpc_winsocket * socket, void (*cb) (void *, int), void *opaque) -{ - socket_notify_on_iocp (socket, cb, opaque, &socket->write_info); +void grpc_socket_notify_on_write(grpc_winsocket *socket, + void (*cb)(void *, int), void *opaque) { + socket_notify_on_iocp(socket, cb, opaque, &socket->write_info); } -void -grpc_socket_notify_on_read (grpc_winsocket * socket, void (*cb) (void *, int), void *opaque) -{ - socket_notify_on_iocp (socket, cb, opaque, &socket->read_info); +void grpc_socket_notify_on_read(grpc_winsocket *socket, void (*cb)(void *, int), + void *opaque) { + socket_notify_on_iocp(socket, cb, opaque, &socket->read_info); } #endif /* GPR_WINSOCK_SOCKET */ |