From: Martin Ling Date: Sat, 7 Dec 2013 20:16:38 +0000 (+0000) Subject: Windows nonblocking write: Dont't return if async I/O finishes immediately. X-Git-Tag: libserialport-0.1.0~25 X-Git-Url: http://sigrok.org/gitweb/?a=commitdiff_plain;h=64d996216e5cea58192d7842e4b364e19fd3d698;p=libserialport.git Windows nonblocking write: Dont't return if async I/O finishes immediately. --- 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");