diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2013-02-06 22:40:18 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2013-02-06 22:40:18 +0000 |
commit | d617bce48cdc251c0b8c07713c03065d9c122aa2 (patch) | |
tree | c583f9846d43da4bd06b379bb1f0296b4b5a43f0 /libgo/go/net/fd_unix.go | |
parent | b96299a1353eae165dc0693b4917b4d757675b9d (diff) | |
download | gcc-d617bce48cdc251c0b8c07713c03065d9c122aa2.zip gcc-d617bce48cdc251c0b8c07713c03065d9c122aa2.tar.gz gcc-d617bce48cdc251c0b8c07713c03065d9c122aa2.tar.bz2 |
re PR go/56172 (net FAILs on Solaris)
PR go/56172
net: Fixes for select based pollster.
Make Close work properly, mainly for testing. Restart the
select if a descriptor is closed.
From-SVN: r195823
Diffstat (limited to 'libgo/go/net/fd_unix.go')
-rw-r--r-- | libgo/go/net/fd_unix.go | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/libgo/go/net/fd_unix.go b/libgo/go/net/fd_unix.go index e9d2e41..42b0c74 100644 --- a/libgo/go/net/fd_unix.go +++ b/libgo/go/net/fd_unix.go @@ -110,16 +110,24 @@ func (s *pollServer) AddFD(fd *netFD, mode int) error { // any I/O running on fd. The caller must have locked // pollserver. func (s *pollServer) Evict(fd *netFD) { + doWakeup := false if s.pending[fd.sysfd<<1] == fd { s.WakeFD(fd, 'r', errClosing) - s.poll.DelFD(fd.sysfd, 'r') + if s.poll.DelFD(fd.sysfd, 'r') { + doWakeup = true + } delete(s.pending, fd.sysfd<<1) } if s.pending[fd.sysfd<<1|1] == fd { s.WakeFD(fd, 'w', errClosing) - s.poll.DelFD(fd.sysfd, 'w') + if s.poll.DelFD(fd.sysfd, 'w') { + doWakeup = true + } delete(s.pending, fd.sysfd<<1|1) } + if doWakeup { + s.Wakeup() + } } var wakeupbuf [1]byte |