This patch fixes a race condition when closing the ConPTY of a process on Windows. The read operation in `ConnectionGenericFile::Read` is asynchronous because the ConPTY does not work with synchronous reads. However, this is prone to a race condition if the ConPTY is closed between the `ReadFile` and the `WaitForMultipleObjects`. This eventually leads to the data being truncated, i.e some of the STDOUT is missing. The fix is to introduce a mutex which prevents the ConPTY from closing while a Read loop is in progress. At the end of the pipe, `WaitForMultipleObjects` hangs until it receives a `ERROR_BROKEN_PIPE` event, which is signaled when closing the ConPTY. It's important to close the Read thread before closing the ConPTY, otherwise the thread deadlocks waiting for the `ERROR_BROKEN_PIPE` which is never sent because the ConPTY is waiting for the thread to exit before closing. All of this logic is encapsulated in the `ConnectionConPTY` class which is a subclass of `ConnectionGenericFile`. `ConnectionConPTY` only supports reading from the ConPTY. To write to it, `IOHandlerProcessSTDIOWindows` should be used instead. This patch depends on: - https://github.com/llvm/llvm-project/pull/182536 This patch replaces https://github.com/llvm/llvm-project/pull/182109. --------- Co-authored-by: Nerixyz <nero.9@hotmail.de>
13 KiB
13 KiB