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.
This commit is contained in:
Cristian Maglie
2017-03-12 22:44:28 +02:00
parent 383ed1cd2a
commit f355dbf608

View File

@@ -82,14 +82,15 @@ func (port *windowsPort) Read(p []byte) (int, error) {
defer syscall.CloseHandle(ev.HEvent) defer syscall.CloseHandle(ev.HEvent)
for { for {
err := syscall.ReadFile(port.handle, p, &readed, ev) err := syscall.ReadFile(port.handle, p, &readed, ev)
if err == syscall.ERROR_IO_PENDING {
err = getOverlappedResult(port.handle, ev, &readed, true)
}
switch err { switch err {
case nil: case nil:
// operation completed successfully // operation completed successfully
case syscall.ERROR_IO_PENDING: case syscall.ERROR_OPERATION_ABORTED:
// wait for overlapped I/O to complete // port may have been closed
if err := getOverlappedResult(port.handle, ev, &readed, true); err != nil { return int(readed), &PortError{code: PortClosed, causedBy: err}
return int(readed), err
}
default: default:
// error happened // error happened
return int(readed), err return int(readed), err