From 64d996216e5cea58192d7842e4b364e19fd3d698 Mon Sep 17 00:00:00 2001 From: Martin Ling Date: Sat, 7 Dec 2013 20:16:38 +0000 Subject: [PATCH] Windows nonblocking write: Dont't return if async I/O finishes immediately. --- serialport.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/serialport.c b/serialport.c index b7dd66a..712b951 100644 --- a/serialport.c +++ b/serialport.c @@ -1000,9 +1000,16 @@ enum sp_return sp_nonblocking_write(struct sp_port *port, const void *buf, size_ /* Start asynchronous write. */ if (WriteFile(port->hdl, &port->pending_byte, 1, NULL, &port->write_ovl) == 0) { if (GetLastError() == ERROR_IO_PENDING) { - DEBUG("Asynchronous write started"); - port->writing = 1; - RETURN_VALUE("%d", ++written); + if (HasOverlappedIoCompleted(&port->write_ovl)) { + DEBUG("Asynchronous write completed immediately"); + port->writing = 0; + written++; + continue; + } else { + DEBUG("Asynchronous write running"); + port->writing = 1; + RETURN_VALUE("%d", ++written); + } } else { /* Actual failure of some kind. */ RETURN_FAIL("WriteFile() failed");