@@ -112,13 +112,13 @@ inline void open_logic(HANDLE &handle, std::wstring name, os::windows::pipe_read
112
112
throw std::runtime_error (msg.data ());
113
113
}
114
114
115
- DWORD pipe_read_mode = 0 ;
115
+ DWORD pipe_read_mode = PIPE_WAIT ;
116
116
switch (mode) {
117
117
case os::windows::pipe_read_mode::Message:
118
- pipe_read_mode = PIPE_READMODE_MESSAGE;
118
+ pipe_read_mode | = PIPE_READMODE_MESSAGE;
119
119
break ;
120
120
default :
121
- pipe_read_mode = PIPE_READMODE_BYTE;
121
+ pipe_read_mode | = PIPE_READMODE_BYTE;
122
122
break ;
123
123
}
124
124
@@ -255,52 +255,58 @@ os::error os::windows::named_pipe::write(std::unique_ptr<os::windows::async_requ
255
255
256
256
os::error os::windows::named_pipe::read (char *buffer, size_t buffer_length, std::shared_ptr<os::async_op> &op,
257
257
os::async_op_cb_t cb) {
258
+ os::error ec;
259
+
258
260
std::shared_ptr<os::windows::async_request> ar = std::static_pointer_cast<os::windows::async_request>(op);
259
261
if (!ar) {
260
262
ar = std::make_shared<os::windows::async_request>();
261
263
}
264
+ op = std::static_pointer_cast<os::async_op>(ar);
262
265
ar->set_callback (cb);
263
266
ar->set_handle (handle);
264
267
265
268
SetLastError (ERROR_SUCCESS);
266
- if (!ReadFileEx (handle, buffer, DWORD (buffer_length), ar->get_overlapped_pointer (),
267
- os::windows::async_request::completion_routine)
268
- || (GetLastError () != ERROR_SUCCESS)) {
269
- os::error error = utility::translate_error (GetLastError ());
270
- if (error != os::error::Success) {
271
- ar->cancel ();
272
- }
273
- return error;
269
+ BOOL suc = ReadFileEx (handle, buffer, DWORD (buffer_length), ar->get_overlapped_pointer (),
270
+ os::windows::async_request::completion_routine);
271
+ DWORD error = GetLastError ();
272
+ ec = utility::translate_error (error);
273
+
274
+ if (suc == 0 ) {
275
+ ar->call_callback (ec, buffer_length);
276
+ ar->cancel ();
277
+ return ec;
274
278
}
275
279
276
280
ar->set_valid (true );
277
- op = std::static_pointer_cast<os::async_op>(ar);
278
- return os::error::Success;
281
+ return ec;
279
282
}
280
283
281
284
os::error os::windows::named_pipe::write (const char *buffer, size_t buffer_length, std::shared_ptr<os::async_op> &op,
282
285
os::async_op_cb_t cb) {
286
+ os::error ec;
287
+
283
288
std::shared_ptr<os::windows::async_request> ar = std::static_pointer_cast<os::windows::async_request>(op);
284
289
if (!ar) {
285
290
ar = std::make_shared<os::windows::async_request>();
286
291
}
292
+ op = std::static_pointer_cast<os::async_op>(ar);
287
293
ar->set_callback (cb);
288
294
ar->set_handle (handle);
289
295
290
296
SetLastError (ERROR_SUCCESS);
291
- if (!WriteFileEx (handle, buffer, DWORD (buffer_length), ar->get_overlapped_pointer (),
292
- os::windows::async_request::completion_routine)
293
- || (GetLastError () != ERROR_SUCCESS)) {
294
- os::error error = utility::translate_error (GetLastError ());
295
- if (error != os::error::Success) {
296
- ar->cancel ();
297
- }
298
- return error;
297
+ BOOL suc = WriteFileEx (handle, buffer, DWORD (buffer_length), ar->get_overlapped_pointer (),
298
+ os::windows::async_request::completion_routine);
299
+ DWORD error = GetLastError ();
300
+ ec = utility::translate_error (error);
301
+
302
+ if (suc == 0 ) {
303
+ ar->call_callback (ec, buffer_length);
304
+ ar->cancel ();
305
+ return ec;
299
306
}
300
307
301
308
ar->set_valid (true );
302
- op = std::static_pointer_cast<os::async_op>(ar);
303
- return os::error::Success;
309
+ return ec;
304
310
}
305
311
306
312
bool os::windows::named_pipe::is_created () {
@@ -313,29 +319,41 @@ bool os::windows::named_pipe::is_connected() {
313
319
}
314
320
315
321
os::error os::windows::named_pipe::accept (std::unique_ptr<os::windows::async_request> &request) {
322
+ std::shared_ptr<os::windows::async_request> ars = std::move (request);
323
+ os::error ec = accept (std::static_pointer_cast<os::async_op>(ars), nullptr );
324
+ request.reset (ars.get ());
325
+ return ec;
326
+ }
327
+
328
+ os::error os::windows::named_pipe::accept (std::shared_ptr<os::async_op> &op, os::async_op_cb_t cb) {
329
+ os::error ec;
330
+
316
331
if (!is_created ()) {
317
332
return os::error::Error;
318
333
}
319
334
320
- if (!request) {
321
- request = std::make_unique<os::windows::async_request>();
335
+ std::shared_ptr<os::windows::async_request> ar = std::static_pointer_cast<os::windows::async_request>(op);
336
+ if (!ar) {
337
+ ar = std::make_shared<os::windows::async_request>();
322
338
}
323
- request->set_handle (handle);
339
+ op = std::static_pointer_cast<os::async_op>(ar);
340
+ ar->set_callback (cb);
341
+ ar->set_handle (handle);
324
342
325
343
SetLastError (ERROR_SUCCESS);
326
- if (!ConnectNamedPipe (handle, request->get_overlapped_pointer ()) || (GetLastError () != ERROR_SUCCESS)) {
327
- DWORD error = GetLastError ();
328
- if (error == ERROR_MORE_DATA) {
329
- return os::error::MoreData;
330
- } else if (error == ERROR_BROKEN_PIPE) {
331
- return os::error::Disconnected;
332
- } else if (error == ERROR_PIPE_CONNECTED) {
333
- return os::error::Connected;
334
- } else if (error != ERROR_IO_PENDING) {
335
- return os::error::Error;
336
- }
344
+ BOOL suc = ConnectNamedPipe (handle, ar->get_overlapped_pointer ());
345
+ ec = utility::translate_error (GetLastError ());
346
+
347
+ if (ec != os::error::Pending && ec != os::error::Connected) {
348
+ ar->call_callback (ec, 0 );
349
+ ar->cancel ();
350
+ return ec;
337
351
}
338
352
339
- request->set_valid (true );
340
- return os::error::Success;
353
+ ar->set_valid (true );
354
+ if (ec == os::error::Connected) {
355
+ ar->call_callback (ec, 0 );
356
+ }
357
+
358
+ return ec;
341
359
}
0 commit comments