From e28a8cde53133735b5269ad9c89614b2cc100ce9 Mon Sep 17 00:00:00 2001 From: kun chen Date: Wed, 14 May 2025 13:53:29 +0800 Subject: [PATCH 1/2] modify read and write overlapped file on windows Signed-off-by: kun chen --- src/common/base.cpp | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/src/common/base.cpp b/src/common/base.cpp index 57d08592..b1f74f79 100644 --- a/src/common/base.cpp +++ b/src/common/base.cpp @@ -2325,10 +2325,24 @@ void CloseOpenFd(void) DWORD bytesRead = 0; OVERLAPPED ov = {}; SOCKET s = fd; - BOOL bWriteStat = ReadFile((HANDLE)s, buf, count, &bytesRead, &ov); - if (bWriteStat) { + BOOL bRead = ReadFile((HANDLE)s, buf, count, &bytesRead, &ov); + if (bRead) { return bytesRead; - } else { + } + DWORD error = GetLastError(); + if (error != ERROR_IO_PENDING) { + WRITE_LOG(LOG_DEBUG, "ReadFile error:%d", error); + return -1; + } + WaitForSingleObject((HANDLE)s, INFINITE); + BOOL bRes = GetOverlappedResult((HANDLE)s, &ov, &bytesRead, FALSE); + if (bRes) { + WRITE_LOG(LOG_DEBUG, "count:%zu bytesRead:%d", count, bytesRead); + return bytesRead; + } + error = GetLastError(); + if (error != ERROR_IO_INCOMPLETE) { + WRITE_LOG(LOG_DEBUG, "read GetOverlappedResult error:%d", error); return -1; } #else @@ -2342,10 +2356,23 @@ void CloseOpenFd(void) DWORD bytesWrite = 0; OVERLAPPED ov = {}; SOCKET s = fd; - BOOL bWriteStat = WriteFile((HANDLE)s, buf, count, &bytesWrite, &ov); - if (bWriteStat) { + BOOL bWrite = WriteFile((HANDLE)s, buf, count, &bytesWrite, &ov); + if (bWrite) { return 1; - } else { + } + DWORD error = GetLastError(); + if (error != ERROR_IO_PENDING) { + WRITE_LOG(LOG_DEBUG, "WriteFile error:%d", error); + return -1; + } + WaitForSingleObject((HANDLE)s, INFINITE); + BOOL bRes = GetOverlappedResult((HANDLE)s, &ov, &bytesWrite, FALSE); + if (bRes) { + return 1; + } + error = GetLastError(); + if (error != ERROR_IO_INCOMPLETE) { + WRITE_LOG(LOG_DEBUG, "write GetOverlappedResult error:%d", error); return -1; } #else -- Gitee From 06eb7b1db9a4747f3152ffab5995f3cf416f6eaa Mon Sep 17 00:00:00 2001 From: kun chen Date: Mon, 19 May 2025 20:40:00 +0800 Subject: [PATCH 2/2] modify read and write overlapped file on windows Signed-off-by: kun chen --- src/common/base.cpp | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/src/common/base.cpp b/src/common/base.cpp index b1f74f79..02f9832f 100644 --- a/src/common/base.cpp +++ b/src/common/base.cpp @@ -2334,17 +2334,14 @@ void CloseOpenFd(void) WRITE_LOG(LOG_DEBUG, "ReadFile error:%d", error); return -1; } - WaitForSingleObject((HANDLE)s, INFINITE); - BOOL bRes = GetOverlappedResult((HANDLE)s, &ov, &bytesRead, FALSE); - if (bRes) { - WRITE_LOG(LOG_DEBUG, "count:%zu bytesRead:%d", count, bytesRead); + constexpr int ms = 3000; + bRead = GetOverlappedResultEx((HANDLE)s, &ov, &bytesRead, ms, FALSE); + if (bRead) { return bytesRead; } error = GetLastError(); - if (error != ERROR_IO_INCOMPLETE) { - WRITE_LOG(LOG_DEBUG, "read GetOverlappedResult error:%d", error); - return -1; - } + WRITE_LOG(LOG_DEBUG, "read GetOverlappedResult error:%d", error); + return -1; #else return TEMP_FAILURE_RETRY(read(fd, buf, count)); #endif @@ -2365,16 +2362,14 @@ void CloseOpenFd(void) WRITE_LOG(LOG_DEBUG, "WriteFile error:%d", error); return -1; } - WaitForSingleObject((HANDLE)s, INFINITE); - BOOL bRes = GetOverlappedResult((HANDLE)s, &ov, &bytesWrite, FALSE); - if (bRes) { + constexpr int ms = 3000; + bWrite = GetOverlappedResultEx((HANDLE)s, &ov, &bytesWrite, ms, FALSE); + if (bWrite) { return 1; } error = GetLastError(); - if (error != ERROR_IO_INCOMPLETE) { - WRITE_LOG(LOG_DEBUG, "write GetOverlappedResult error:%d", error); - return -1; - } + WRITE_LOG(LOG_DEBUG, "write GetOverlappedResult error:%d", error); + return -1; #else return TEMP_FAILURE_RETRY(write(fd, buf, count)); #endif -- Gitee