From 62ed9f801abe409d3f7c1cfa91287896187f2ac0 Mon Sep 17 00:00:00 2001 From: Martin Ling Date: Mon, 3 Jul 2017 20:55:13 +0100 Subject: [PATCH] windows: Break out helper function for awaiting previous write completion. --- serialport.c | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/serialport.c b/serialport.c index db2aa43..1b71cdb 100644 --- a/serialport.c +++ b/serialport.c @@ -731,6 +731,27 @@ SP_API enum sp_return sp_drain(struct sp_port *port) #endif } +#ifdef _WIN32 +static enum sp_return await_write_completion(struct sp_port *port) +{ + TRACE("%p", port); + DWORD bytes_written; + BOOL result; + + /* Wait for previous non-blocking write to complete, if any. */ + if (port->writing) { + DEBUG("Waiting for previous write to complete"); + result = GetOverlappedResult(port->hdl, &port->write_ovl, &bytes_written, TRUE); + port->writing = 0; + if (!result) + RETURN_FAIL("Previous write failed to complete"); + DEBUG("Previous write completed"); + } + + RETURN_OK(); +} +#endif + SP_API enum sp_return sp_blocking_write(struct sp_port *port, const void *buf, size_t count, unsigned int timeout_ms) { @@ -753,17 +774,8 @@ SP_API enum sp_return sp_blocking_write(struct sp_port *port, const void *buf, #ifdef _WIN32 DWORD bytes_written = 0; - BOOL result; - /* Wait for previous non-blocking write to complete, if any. */ - if (port->writing) { - DEBUG("Waiting for previous write to complete"); - result = GetOverlappedResult(port->hdl, &port->write_ovl, &bytes_written, TRUE); - port->writing = 0; - if (!result) - RETURN_FAIL("Previous write failed to complete"); - DEBUG("Previous write completed"); - } + TRY(await_write_completion(port)); /* Set timeout. */ if (port->timeouts.WriteTotalTimeoutConstant != timeout_ms) {