Backport parts of EventPipe PR 43711 not currently in C library. (#46214)
authorJohan Lorensson <lateralusx.github@gmail.com>
Thu, 7 Jan 2021 08:04:11 +0000 (09:04 +0100)
committerGitHub <noreply@github.com>
Thu, 7 Jan 2021 08:04:11 +0000 (09:04 +0100)
src/native/eventpipe/ds-ipc-win32.c
src/native/eventpipe/ds-ipc.c

index 7178aeb..2a05b36 100644 (file)
@@ -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;
index a14b457..929d919 100644 (file)
@@ -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);