mirror of
https://github.com/golang/go
synced 2024-11-05 19:56:11 -07: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:
parent
1605176e25
commit
37a5374c81
@ -126,13 +126,34 @@ func newPollServer() (s *pollServer, err *os.Error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *pollServer) AddFD(fd *netFD, mode int) {
|
func (s *pollServer) AddFD(fd *netFD, mode int) {
|
||||||
if err := s.poll.AddFD(fd.fd, mode, false); err != nil {
|
// TODO(rsc): This check handles a race between
|
||||||
panicln("pollServer AddFD ", fd.fd, ": ", err.String(), "\n");
|
// 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
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var t int64;
|
var t int64;
|
||||||
key := fd.fd << 1;
|
key := intfd << 1;
|
||||||
if mode == 'r' {
|
if mode == 'r' {
|
||||||
fd.ncr++;
|
fd.ncr++;
|
||||||
t = fd.rdeadline;
|
t = fd.rdeadline;
|
||||||
|
Loading…
Reference in New Issue
Block a user