From 5876428a6f483a6774844b12916d90505ce386ac Mon Sep 17 00:00:00 2001 From: lateralusX Date: Fri, 18 Dec 2020 11:49:25 +0100 Subject: [PATCH] Backport parts of EventPipe PR 43711 not currently in C library. --- src/native/eventpipe/ds-ipc-win32.c | 15 +++++++++------ src/native/eventpipe/ds-ipc.c | 2 ++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/native/eventpipe/ds-ipc-win32.c b/src/native/eventpipe/ds-ipc-win32.c index 7178aeb76ab37..2a05b36a6bd3a 100644 --- a/src/native/eventpipe/ds-ipc-win32.c +++ b/src/native/eventpipe/ds-ipc-win32.c @@ -429,13 +429,14 @@ ds_ipc_accept ( if (!success) { if (callback) callback ("Failed to GetOverlappedResults for NamedPipe server", GetLastError()); - ep_raise_error (); + // close the pipe (cleanup and reset below) + CloseHandle (ipc->pipe); + } else { + // create new IpcStream using handle (passes ownership to pStream) + stream = ipc_stream_alloc (ipc->pipe, DS_IPC_CONNECTION_MODE_LISTEN); + ep_raise_error_if_nok (stream != NULL); } - // create new IpcStream using handle and reset the Server object so it can listen again - stream = ipc_stream_alloc (ipc->pipe, DS_IPC_CONNECTION_MODE_LISTEN); - ep_raise_error_if_nok (stream != NULL); - // reset the server ipc->pipe = INVALID_HANDLE_VALUE; ipc->is_listening = false; @@ -637,6 +638,7 @@ ipc_stream_read_func ( DS_EXIT_BLOCKING_PAL_SECTION; } } + // error is unrecoverable, so return as such } *bytes_read = (uint32_t)read; @@ -690,7 +692,7 @@ ipc_stream_write_func ( ipc_stream->pipe, // pipe overlap, // overlapped &written, // out actual number of bytes written - true) != FALSE; // block until async IO completes + true) != FALSE; // block until async IO completes } else { // We either timed out or something else went wrong. // For any error, attempt to cancel IO and ensure the cancel happened @@ -707,6 +709,7 @@ ipc_stream_write_func ( DS_EXIT_BLOCKING_PAL_SECTION; } } + // error is unrecoverable, so return as such } *bytes_written = (uint32_t)written; diff --git a/src/native/eventpipe/ds-ipc.c b/src/native/eventpipe/ds-ipc.c index a14b457858e36..929d919d95b75 100644 --- a/src/native/eventpipe/ds-ipc.c +++ b/src/native/eventpipe/ds-ipc.c @@ -384,6 +384,8 @@ ds_ipc_stream_factory_get_next_available_stream (ds_ipc_error_callback_func call EP_ASSERT (port != NULL); if (!stream) { // only use first signaled stream; will get others on subsequent calls stream = ds_port_get_connected_stream_vcall (port, callback); + if (!stream) + saw_error = true; _ds_current_port = port; } DS_LOG_INFO_2 ("ds_ipc_stream_factory_get_next_available_stream - SIG :: Poll attempt: %d, connection %d signalled.\n", poll_attempts, connection_id);