From f355dbf6081e7f1e8b12d832608eea18a91ef302 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Sun, 12 Mar 2017 22:44:28 +0200 Subject: [PATCH] windows: correcly signal PortClosed error on blocked Read() This commit fix regression test TestConcurrentReadAndWrite. Even if the test checks purpose is another it has detected anyway that the returned error is incorrect. Another specific test for closing port detection will be added in the future. --- serial_windows.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/serial_windows.go b/serial_windows.go index ec328f9..46803c6 100644 --- a/serial_windows.go +++ b/serial_windows.go @@ -82,14 +82,15 @@ func (port *windowsPort) Read(p []byte) (int, error) { defer syscall.CloseHandle(ev.HEvent) for { err := syscall.ReadFile(port.handle, p, &readed, ev) + if err == syscall.ERROR_IO_PENDING { + err = getOverlappedResult(port.handle, ev, &readed, true) + } switch err { case nil: // operation completed successfully - case syscall.ERROR_IO_PENDING: - // wait for overlapped I/O to complete - if err := getOverlappedResult(port.handle, ev, &readed, true); err != nil { - return int(readed), err - } + case syscall.ERROR_OPERATION_ABORTED: + // port may have been closed + return int(readed), &PortError{code: PortClosed, causedBy: err} default: // error happened return int(readed), err