[Lldb-commits] [lldb] [lldb] Assorted improvements to the Pipe class (PR #128719)
John Harrison via lldb-commits
lldb-commits at lists.llvm.org
Tue Feb 25 09:38:55 PST 2025
================
@@ -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
More information about the lldb-commits
mailing list