From b14a87a785e4607559d0832b4af3550ffae64321 Mon Sep 17 00:00:00 2001 From: microcai Date: Mon, 6 Jan 2025 00:05:30 +0800 Subject: [PATCH] debug and fix iocp_asio --- example/unbufcpy/unbufcp5/unbufcp5.cpp | 32 +++++++++++--------------- iocp_asio/src/iocp.cpp | 14 +++++++---- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/example/unbufcpy/unbufcp5/unbufcp5.cpp b/example/unbufcpy/unbufcp5/unbufcp5.cpp index 21855d2..a2823b1 100644 --- a/example/unbufcpy/unbufcp5/unbufcp5.cpp +++ b/example/unbufcpy/unbufcp5/unbufcp5.cpp @@ -165,16 +165,10 @@ class FiberChannel std::deque m_push_awaiting; }; -struct OverlappedBuffer : public FiberOVERLAPPED -{ - IOBuffer buf; -}; - struct FileCopyer { uint64_t cur_pos = 0; - std::array buffers; FiberChannel chan; FileCopyer(HANDLE iocp) @@ -182,28 +176,30 @@ struct FileCopyer { } - void buffer_carrier(int buffer_index, HANDLE srcFile, HANDLE destFile, FiberChannel& chan) + void buffer_carrier(HANDLE srcFile, HANDLE destFile, FiberChannel& chan) { for (;;) { - buffers[buffer_index].set_offset(cur_pos); + IOBuffer buf; + FiberOVERLAPPED ov; + ov.set_offset(cur_pos); cur_pos += BUFFER_SIZE; DWORD readbytes = 0; - auto ret = ReadFile(srcFile, buffers[buffer_index].buf, BUFFER_SIZE, &readbytes, &buffers[buffer_index]); - buffers[buffer_index].last_error = GetLastError(); - if (!(!ret && buffers[buffer_index].last_error != ERROR_IO_PENDING)) - readbytes = get_overlapped_result(buffers[buffer_index]); - if (buffers[buffer_index].last_error) + auto ret = ReadFile(srcFile, buf, BUFFER_SIZE, &readbytes, &ov); + ov.last_error = GetLastError(); + if (!(!ret && ov.last_error != ERROR_IO_PENDING)) + readbytes = get_overlapped_result(ov); + if (ov.last_error) { chan.push(1); return; } DWORD written = 0; - ret = WriteFile(destFile, buffers[buffer_index].buf, (readbytes + PageSize - 1) & ~(PageSize - 1), &written, &buffers[buffer_index]); - buffers[buffer_index].last_error = GetLastError(); - if (!(!ret && buffers[buffer_index].last_error != ERROR_IO_PENDING)) - readbytes = get_overlapped_result(buffers[buffer_index]); + ret = WriteFile(destFile, buf, (readbytes + PageSize - 1) & ~(PageSize - 1), &written, &ov); + ov.last_error = GetLastError(); + if (!(!ret && ov.last_error != ERROR_IO_PENDING)) + written = get_overlapped_result(ov); } } @@ -212,7 +208,7 @@ struct FileCopyer for (int i = 0; i < PENDING_IO; i++) { - create_detached_coroutine(std::bind(&FileCopyer::buffer_carrier, this, i, srcFile, destFile, std::ref(chan))); + create_detached_coroutine(std::bind(&FileCopyer::buffer_carrier, this, srcFile, destFile, std::ref(chan))); } // wait until completed. diff --git a/iocp_asio/src/iocp.cpp b/iocp_asio/src/iocp.cpp index 7613ea3..ec48cc9 100644 --- a/iocp_asio/src/iocp.cpp +++ b/iocp_asio/src/iocp.cpp @@ -888,6 +888,12 @@ IOCP_DECL BOOL ReadFile( if (lpNumberOfBytesRead) *lpNumberOfBytesRead = readed; + if (readed == 0) + { + SetLastError(ERROR_HANDLE_EOF); + return FALSE; + } + asio_operation* op = new asio_operation; // op->lpCompletionRoutine = lpCompletionRoutine; op->overlapped_ptr = lpOverlapped; @@ -901,7 +907,7 @@ IOCP_DECL BOOL ReadFile( SetLastError(ERROR_IO_PENDING); - return readed > 0; + return FALSE; } IOCP_DECL BOOL WriteFile( @@ -921,7 +927,7 @@ IOCP_DECL BOOL WriteFile( iocp_handle_emu_class* iocp = s->_iocp; - auto write_ret = write(s->native_handle(), lpBuffer, nNumberOfBytesToWrite); + auto write_ret = pwrite(s->native_handle(), lpBuffer, nNumberOfBytesToWrite, lpOverlapped->offset_64); if (lpNumberOfBytesWritten) *lpNumberOfBytesWritten = write_ret; @@ -933,7 +939,7 @@ IOCP_DECL BOOL WriteFile( op->overlapped_ptr = lpOverlapped; lpOverlapped->Internal = reinterpret_cast(op); op->CompletionKey = s->_completion_key; - op->last_error = errno; + op->last_error = write_ret <0 ? errno : 0; op->NumberOfBytes = write_ret; std::scoped_lock l(iocp->result_mutex); @@ -941,7 +947,7 @@ IOCP_DECL BOOL WriteFile( SetLastError(ERROR_IO_PENDING); - return write_ret > 0; + return FALSE; } asio::io_context SOCKET_emu_class::internal_fake_io_context;