re PR go/48312 (http, rpc, websocket tests hang on Solaris 2/x86)
authorIan Lance Taylor <ian@gcc.gnu.org>
Mon, 28 Mar 2011 18:35:53 +0000 (18:35 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Mon, 28 Mar 2011 18:35:53 +0000 (18:35 +0000)
PR go/48312
Fix fd_select.go for changes in FD handling.

We have to wake up the goroutine waiting in select each time
we change the set of descriptors we are waiting for, unlike
epoll.

From-SVN: r171623

libgo/go/net/fd.go
libgo/go/net/fd_linux.go
libgo/go/net/fd_select.go
libgo/go/net/newpollserver.go
libgo/go/net/newpollserver_rtems.go

index 7acee149e1f760936b6e850ac7c9a2581d2b6f97..c8440ae484a9c5e5fcdb9b4ced35464d7f8c5283 100644 (file)
@@ -122,9 +122,13 @@ func (s *pollServer) AddFD(fd *netFD, mode int) {
                doWakeup = true
        }
 
-       if err := s.poll.AddFD(intfd, mode, false); err != nil {
+       wake, err := s.poll.AddFD(intfd, mode, false)
+       if err != nil {
                panic("pollServer AddFD " + err.String())
        }
+       if wake {
+               doWakeup = true
+       }
 
        s.Unlock()
 
index 69fbc02c0c100a775919d4afa99853622d2c0a34..dcf65c014d58009feed566d1e9a3c1597165ca54 100644 (file)
@@ -47,7 +47,7 @@ func newpollster() (p *pollster, err os.Error) {
        return p, nil
 }
 
-func (p *pollster) AddFD(fd int, mode int, repeat bool) os.Error {
+func (p *pollster) AddFD(fd int, mode int, repeat bool) (bool, os.Error) {
        // pollServer is locked.
 
        var already bool
@@ -69,10 +69,10 @@ func (p *pollster) AddFD(fd int, mode int, repeat bool) os.Error {
                op = syscall.EPOLL_CTL_ADD
        }
        if e := syscall.EpollCtl(p.epfd, op, fd, &p.ctlEvent); e != 0 {
-               return os.NewSyscallError("epoll_ctl", e)
+               return false, os.NewSyscallError("epoll_ctl", e)
        }
        p.events[fd] = p.ctlEvent.Events
-       return nil
+       return false, nil
 }
 
 func (p *pollster) StopWaiting(fd int, bits uint) {
index 61759ca6ebc7fbd0de41d90ea37b07dbb8c2778f..e9c68ab2cccf30fc026ba2b33ea27d0e7b9ded6b 100644 (file)
@@ -32,7 +32,9 @@ func newpollster() (p *pollster, err os.Error) {
        return p, nil
 }
 
-func (p *pollster) AddFD(fd int, mode int, repeat bool) os.Error {
+func (p *pollster) AddFD(fd int, mode int, repeat bool) (bool, os.Error) {
+       // pollServer is locked.
+
        if mode == 'r' {
                syscall.FDSet(fd, p.readFds)
        } else {
@@ -47,10 +49,12 @@ func (p *pollster) AddFD(fd int, mode int, repeat bool) os.Error {
                p.maxFd = fd
        }
 
-       return nil
+       return true, nil
 }
 
 func (p *pollster) DelFD(fd int, mode int) {
+       // pollServer is locked.
+
        if mode == 'r' {
                if !syscall.FDIsSet(fd, p.readFds) {
                        print("Select unexpected fd=", fd, " for read\n")
@@ -71,7 +75,7 @@ func (p *pollster) DelFD(fd int, mode int) {
        // We don't worry about maxFd here.
 }
 
-func (p *pollster) WaitFD(nsec int64) (fd int, mode int, err os.Error) {
+func (p *pollster) WaitFD(s *pollServer, nsec int64) (fd int, mode int, err os.Error) {
        if p.nReady == 0 {
                var timeout *syscall.Timeval
                var tv syscall.Timeval
@@ -89,7 +93,10 @@ func (p *pollster) WaitFD(nsec int64) (fd int, mode int, err os.Error) {
                        tmpReadFds = *p.readFds
                        tmpWriteFds = *p.writeFds
 
+                       s.Unlock()
                        n, e = syscall.Select(p.maxFd + 1, &tmpReadFds, &tmpWriteFds, nil, timeout)
+                       s.Lock()
+
                        if e != syscall.EINTR {
                                break
                        }
index 820e70b46f32fbc8cb9fb86e59307befff40ca03..fff54dba71f45938e6b31d306b93de8c209db8f8 100644 (file)
@@ -31,7 +31,7 @@ func newPollServer() (s *pollServer, err os.Error) {
        if s.poll, err = newpollster(); err != nil {
                goto Error
        }
-       if err = s.poll.AddFD(s.pr.Fd(), 'r', true); err != nil {
+       if _, err = s.poll.AddFD(s.pr.Fd(), 'r', true); err != nil {
                s.poll.Close()
                goto Error
        }
index 05cb71a54daa352fc4a87a280d39e0a74f40660f..7933f09f19488f424b7674f1dc6a5c8f000ab88a 100644 (file)
@@ -68,7 +68,7 @@ func newPollServer() (s *pollServer, err os.Error) {
        if s.poll, err = newpollster(); err != nil {
                goto Error
        }
-       if err = s.poll.AddFD(s.pr.Fd(), 'r', true); err != nil {
+       if _, err = s.poll.AddFD(s.pr.Fd(), 'r', true); err != nil {
                s.poll.Close()
                goto Error
        }