@@ -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-
173168struct 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.
0 commit comments