https://github.com/charles-zablit created https://github.com/llvm/llvm-project/pull/182536
If a read is interrupted in `ConnectionGenericFile::Read`, the data that has already been read by `ReadFile` is lost. This patch adds `m_read_pending` to mark a read as interrupted. The next read will pick up the results of the previous read and return the number of `bytes_read`. >From f5688837a040f62f54cf1ca98798d4aee56bf105 Mon Sep 17 00:00:00 2001 From: Charles Zablit <[email protected]> Date: Fri, 20 Feb 2026 16:54:17 +0000 Subject: [PATCH] [lldb][windows] keep track of interrupted reads in ConnectionGenericFile --- .../lldb/Host/windows/ConnectionGenericFileWindows.h | 1 + .../Host/windows/ConnectionGenericFileWindows.cpp | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/lldb/include/lldb/Host/windows/ConnectionGenericFileWindows.h b/lldb/include/lldb/Host/windows/ConnectionGenericFileWindows.h index d8f06a7162b22..62ac1bb35c9f8 100644 --- a/lldb/include/lldb/Host/windows/ConnectionGenericFileWindows.h +++ b/lldb/include/lldb/Host/windows/ConnectionGenericFileWindows.h @@ -43,6 +43,7 @@ class ConnectionGenericFile : public lldb_private::Connection { protected: OVERLAPPED m_overlapped; + bool m_read_pending = false; HANDLE m_file; HANDLE m_event_handles[2]; bool m_owns_file; diff --git a/lldb/source/Host/windows/ConnectionGenericFileWindows.cpp b/lldb/source/Host/windows/ConnectionGenericFileWindows.cpp index 6a6153d6e34a0..28727c82f6e37 100644 --- a/lldb/source/Host/windows/ConnectionGenericFileWindows.cpp +++ b/lldb/source/Host/windows/ConnectionGenericFileWindows.cpp @@ -176,9 +176,17 @@ size_t ConnectionGenericFile::Read(void *dst, size_t dst_len, goto finish; } + if (m_read_pending) { + if (::GetOverlappedResult(m_file, &m_overlapped, &bytes_read, FALSE)) { + m_read_pending = false; + return bytes_read; + } + } + m_overlapped.hEvent = m_event_handles[kBytesAvailableEvent]; result = ::ReadFile(m_file, dst, dst_len, NULL, &m_overlapped); + m_read_pending = true; if (result || ::GetLastError() == ERROR_IO_PENDING) { if (!result) { // The expected return path. The operation is pending. Wait for the @@ -234,6 +242,8 @@ size_t ConnectionGenericFile::Read(void *dst, size_t dst_len, goto finish; finish: + if (return_info.GetStatus() != eConnectionStatusInterrupted) + m_read_pending = false; status = return_info.GetStatus(); if (error_ptr) *error_ptr = return_info.GetError().Clone(); _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
