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)
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