Skip to content

Commit f618d9c

Browse files
committed
debug and fix iocp_asio
1 parent d5fdfc8 commit f618d9c

File tree

2 files changed

+25
-23
lines changed

2 files changed

+25
-23
lines changed

example/unbufcpy/unbufcp5/unbufcp5.cpp

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -165,45 +165,41 @@ class FiberChannel
165165
std::deque<FiberOVERLAPPED*> m_push_awaiting;
166166
};
167167

168-
struct OverlappedBuffer : public FiberOVERLAPPED
169-
{
170-
IOBuffer buf;
171-
};
172-
173168
struct FileCopyer
174169
{
175170
uint64_t cur_pos = 0;
176171

177-
std::array<OverlappedBuffer, PENDING_IO> buffers;
178172
FiberChannel<int> chan;
179173

180174
FileCopyer(HANDLE iocp)
181175
: chan(iocp, PENDING_IO)
182-
{
176+
{
183177
}
184178

185-
void buffer_carrier(int buffer_index, HANDLE srcFile, HANDLE destFile, FiberChannel<int>& chan)
179+
void buffer_carrier(HANDLE srcFile, HANDLE destFile, FiberChannel<int>& chan)
186180
{
187181
for (;;)
188182
{
189-
buffers[buffer_index].set_offset(cur_pos);
183+
IOBuffer buf;
184+
FiberOVERLAPPED ov;
185+
ov.set_offset(cur_pos);
190186
cur_pos += BUFFER_SIZE;
191187

192188
DWORD readbytes = 0;
193-
auto ret = ReadFile(srcFile, buffers[buffer_index].buf, BUFFER_SIZE, &readbytes, &buffers[buffer_index]);
194-
buffers[buffer_index].last_error = GetLastError();
195-
if (!(!ret && buffers[buffer_index].last_error != ERROR_IO_PENDING))
196-
readbytes = get_overlapped_result(buffers[buffer_index]);
197-
if (buffers[buffer_index].last_error)
189+
auto ret = ReadFile(srcFile, buf, BUFFER_SIZE, &readbytes, &ov);
190+
ov.last_error = GetLastError();
191+
if (!(!ret && ov.last_error != ERROR_IO_PENDING))
192+
readbytes = get_overlapped_result(ov);
193+
if (ov.last_error)
198194
{
199195
chan.push(1);
200196
return;
201197
}
202198
DWORD written = 0;
203-
ret = WriteFile(destFile, buffers[buffer_index].buf, (readbytes + PageSize - 1) & ~(PageSize - 1), &written, &buffers[buffer_index]);
204-
buffers[buffer_index].last_error = GetLastError();
205-
if (!(!ret && buffers[buffer_index].last_error != ERROR_IO_PENDING))
206-
readbytes = get_overlapped_result(buffers[buffer_index]);
199+
ret = WriteFile(destFile, buf, (readbytes + PageSize - 1) & ~(PageSize - 1), &written, &ov);
200+
ov.last_error = GetLastError();
201+
if (!(!ret && ov.last_error != ERROR_IO_PENDING))
202+
written = get_overlapped_result(ov);
207203
}
208204
}
209205

@@ -212,7 +208,7 @@ struct FileCopyer
212208

213209
for (int i = 0; i < PENDING_IO; i++)
214210
{
215-
create_detached_coroutine(std::bind(&FileCopyer::buffer_carrier, this, i, srcFile, destFile, std::ref(chan)));
211+
create_detached_coroutine(std::bind(&FileCopyer::buffer_carrier, this, srcFile, destFile, std::ref(chan)));
216212
}
217213

218214
// wait until completed.

iocp_asio/src/iocp.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -888,6 +888,12 @@ IOCP_DECL BOOL ReadFile(
888888
if (lpNumberOfBytesRead)
889889
*lpNumberOfBytesRead = readed;
890890

891+
if (readed == 0)
892+
{
893+
SetLastError(ERROR_HANDLE_EOF);
894+
return FALSE;
895+
}
896+
891897
asio_operation* op = new asio_operation;
892898
// op->lpCompletionRoutine = lpCompletionRoutine;
893899
op->overlapped_ptr = lpOverlapped;
@@ -901,7 +907,7 @@ IOCP_DECL BOOL ReadFile(
901907

902908
SetLastError(ERROR_IO_PENDING);
903909

904-
return readed > 0;
910+
return FALSE;
905911
}
906912

907913
IOCP_DECL BOOL WriteFile(
@@ -921,7 +927,7 @@ IOCP_DECL BOOL WriteFile(
921927

922928
iocp_handle_emu_class* iocp = s->_iocp;
923929

924-
auto write_ret = write(s->native_handle(), lpBuffer, nNumberOfBytesToWrite);
930+
auto write_ret = pwrite(s->native_handle(), lpBuffer, nNumberOfBytesToWrite, lpOverlapped->offset_64);
925931

926932
if (lpNumberOfBytesWritten)
927933
*lpNumberOfBytesWritten = write_ret;
@@ -933,15 +939,15 @@ IOCP_DECL BOOL WriteFile(
933939
op->overlapped_ptr = lpOverlapped;
934940
lpOverlapped->Internal = reinterpret_cast<ULONG_PTR>(op);
935941
op->CompletionKey = s->_completion_key;
936-
op->last_error = errno;
942+
op->last_error = write_ret <0 ? errno : 0;
937943
op->NumberOfBytes = write_ret;
938944

939945
std::scoped_lock<std::mutex> l(iocp->result_mutex);
940946
iocp->results_.emplace_back(op);
941947

942948
SetLastError(ERROR_IO_PENDING);
943949

944-
return write_ret > 0;
950+
return FALSE;
945951
}
946952

947953
asio::io_context SOCKET_emu_class::internal_fake_io_context;

0 commit comments

Comments
 (0)