1
0
mirror of https://github.com/golang/go synced 2024-09-30 16:08:36 -06:00

document and partially fix a race

R=r
DELTA=24  (21 added, 0 deleted, 3 changed)
OCL=27527
CL=27527
This commit is contained in:
Russ Cox 2009-04-15 19:01:48 -07:00
parent 1605176e25
commit 37a5374c81

View File

@ -126,13 +126,34 @@ func newPollServer() (s *pollServer, err *os.Error) {
}
func (s *pollServer) AddFD(fd *netFD, mode int) {
if err := s.poll.AddFD(fd.fd, mode, false); err != nil {
panicln("pollServer AddFD ", fd.fd, ": ", err.String(), "\n");
// TODO(rsc): This check handles a race between
// one goroutine reading and another one closing,
// but it doesn't solve the race completely:
// it still could happen that one goroutine closes
// but we read fd.fd before it does, and then
// another goroutine creates a new open file with
// that fd, which we'd now be referring to.
// The fix is probably to send the Close call
// through the poll server too, except that
// not all Reads and Writes go through the poll
// server even now.
intfd := fd.fd;
if intfd < 0 {
// fd closed underfoot
if mode == 'r' {
fd.cr <- fd
} else {
fd.cw <- fd
}
return
}
if err := s.poll.AddFD(intfd, mode, false); err != nil {
panicln("pollServer AddFD ", intfd, ": ", err.String(), "\n");
return
}
var t int64;
key := fd.fd << 1;
key := intfd << 1;
if mode == 'r' {
fd.ncr++;
t = fd.rdeadline;