UDT: Provide io.EOF signal in udtSocket.fetchReadPacket. Otherwise readers may linger forever.

This commit is contained in:
Kleissner
2021-11-08 05:12:40 +01:00
parent c44b05b9c1
commit 80bf639aea

View File

@@ -2,6 +2,7 @@ package udt
import (
"errors"
"io"
"net"
"sync"
"syscall"
@@ -141,6 +142,9 @@ func (s *udtSocket) fetchReadPacket(blocking bool) ([]byte, error) {
}
select {
case result = <-s.messageIn:
if result == nil { // nil result indicates EOF
return nil, io.EOF
}
return result, nil
case _, ok := <-deadline:
if !ok {
@@ -159,6 +163,9 @@ func (s *udtSocket) fetchReadPacket(blocking bool) ([]byte, error) {
// ok we've read some stuff and there's nothing immediately available
return nil, nil
}
if result == nil { // nil result indicates EOF. Using this instead of socket state allows to drain any buffered data first.
return nil, io.EOF
}
return result, nil
}