]> Cypherpunks repositories - gostls13.git/commitdiff
net: let OS-specific AddFD routine wake up polling thread.
authorIan Lance Taylor <iant@golang.org>
Mon, 28 Mar 2011 19:39:09 +0000 (12:39 -0700)
committerIan Lance Taylor <iant@golang.org>
Mon, 28 Mar 2011 19:39:09 +0000 (12:39 -0700)
With gccgo some operating systems require using select rather
than epoll or kevent.  Using select means that we have to wake
up the polling thread each time we add a new file descriptor.
This implements that in the generic code rather than adding
another wakeup channel, even though nothing in the current net
package uses the capability.

R=rsc, iant2
CC=golang-dev
https://golang.org/cl/4284069

src/pkg/net/fd.go
src/pkg/net/fd_darwin.go
src/pkg/net/fd_freebsd.go
src/pkg/net/fd_linux.go
src/pkg/net/newpollserver.go

index fa163ebe0760cdcaff5f25194c89875e90daa7f3..df4dbce1cfb5de596bc28e2f09885b7d9cfdcc26 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 6ed196324d6dcf89b51314ebc34dcf451d525713..00a049bfd18daa24a18ecd48d631bf9dbea0d36c 100644 (file)
@@ -31,7 +31,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 kmode int
@@ -53,15 +53,15 @@ func (p *pollster) AddFD(fd int, mode int, repeat bool) os.Error {
 
        n, e := syscall.Kevent(p.kq, p.kbuf[0:], p.kbuf[0:], nil)
        if e != 0 {
-               return os.NewSyscallError("kevent", e)
+               return false, os.NewSyscallError("kevent", e)
        }
        if n != 1 || (ev.Flags&syscall.EV_ERROR) == 0 || int(ev.Ident) != fd || int(ev.Filter) != kmode {
-               return os.ErrorString("kqueue phase error")
+               return false, os.ErrorString("kqueue phase error")
        }
        if ev.Data != 0 {
-               return os.Errno(int(ev.Data))
+               return false, os.Errno(int(ev.Data))
        }
-       return nil
+       return false, nil
 }
 
 func (p *pollster) DelFD(fd int, mode int) {
index feea92588ab0eedb951b419e52c63e033feff932..e50883e940b8c1e54c12f1cd3abcdad3f7459dc7 100644 (file)
@@ -31,7 +31,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 kmode int
@@ -51,15 +51,15 @@ func (p *pollster) AddFD(fd int, mode int, repeat bool) os.Error {
 
        n, e := syscall.Kevent(p.kq, p.kbuf[:], nil, nil)
        if e != 0 {
-               return os.NewSyscallError("kevent", e)
+               return false, os.NewSyscallError("kevent", e)
        }
        if n != 1 || (ev.Flags&syscall.EV_ERROR) == 0 || int(ev.Ident) != fd || int(ev.Filter) != kmode {
-               return os.NewSyscallError("kqueue phase error", e)
+               return false, os.NewSyscallError("kqueue phase error", e)
        }
        if ev.Data != 0 {
-               return os.Errno(int(ev.Data))
+               return false, os.Errno(int(ev.Data))
        }
-       return nil
+       return false, nil
 }
 
 func (p *pollster) DelFD(fd int, mode int) {
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 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
        }