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:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user