================ @@ -268,29 +267,24 @@ PipeWindows::GetReadNativeHandle() { return m_read; } HANDLE PipeWindows::GetWriteNativeHandle() { return m_write; } -Status PipeWindows::ReadWithTimeout(void *buf, size_t size, - const std::chrono::microseconds &duration, - size_t &bytes_read) { +llvm::Expected<size_t> PipeWindows::Read(void *buf, size_t size, + const Timeout<std::micro> &timeout) { if (!CanRead()) - return Status(ERROR_INVALID_HANDLE, eErrorTypeWin32); + return Status(ERROR_INVALID_HANDLE, eErrorTypeWin32).takeError(); - bytes_read = 0; - DWORD sys_bytes_read = 0; - BOOL result = - ::ReadFile(m_read, buf, size, &sys_bytes_read, &m_read_overlapped); - if (result) { - bytes_read = sys_bytes_read; - return Status(); - } + DWORD bytes_read = 0; + BOOL result = ::ReadFile(m_read, buf, size, &bytes_read, &m_read_overlapped); + if (result) + return bytes_read; DWORD failure_error = ::GetLastError(); if (failure_error != ERROR_IO_PENDING) - return Status(failure_error, eErrorTypeWin32); + return Status(failure_error, eErrorTypeWin32).takeError(); - DWORD timeout = (duration == std::chrono::microseconds::zero()) - ? INFINITE - : duration.count() / 1000; - DWORD wait_result = ::WaitForSingleObject(m_read_overlapped.hEvent, timeout); + DWORD timeout_msec = + timeout ? ceil<std::chrono::milliseconds>(*timeout).count() : INFINITE; + DWORD wait_result = + ::WaitForSingleObject(m_read_overlapped.hEvent, timeout_msec); ---------------- ashgti wrote:
More for my understanding, but could we use `WaitForSingleObject` / `WaitForMultipleObjects` to emulate select on a FileHandle? That could make `SelectHelper` work on files and sockets on all platforms instead of just sockets on Windows. https://github.com/llvm/llvm-project/pull/128719 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits