]> Cypherpunks repositories - gostls13.git/commitdiff
net: use chan bool instead of chan *netFD to avoid cycle
authorRuss Cox <rsc@golang.org>
Tue, 6 Apr 2010 23:50:27 +0000 (16:50 -0700)
committerRuss Cox <rsc@golang.org>
Tue, 6 Apr 2010 23:50:27 +0000 (16:50 -0700)
The cycle is *netFD -> cw chanl *netFD in struct ->
same *netFD in channel read buffer.

Because channels are finalized, the cycle makes them
uncollectable.  A better fix is to make channels not
finalized anymore, and that will happen, but this is
an easy, reasonable workaround until then.

Another good fix would be to zero the channel receive
buffer entry after the receive.  That too will happen.

R=r
CC=golang-dev
https://golang.org/cl/875043

src/pkg/net/fd.go

index 28e85be2a3ddf45620018ca523e4f0dea638274d..02f7319cbf62f2c923d84bedaa9d7b642c13f7bd 100644 (file)
@@ -26,8 +26,8 @@ type netFD struct {
        family  int
        proto   int
        sysfile *os.File
-       cr      chan *netFD
-       cw      chan *netFD
+       cr      chan bool
+       cw      chan bool
        net     string
        laddr   Addr
        raddr   Addr
@@ -122,9 +122,9 @@ func (s *pollServer) AddFD(fd *netFD, mode int) {
        if intfd < 0 {
                // fd closed underfoot
                if mode == 'r' {
-                       fd.cr <- fd
+                       fd.cr <- true
                } else {
-                       fd.cw <- fd
+                       fd.cw <- true
                }
                return
        }
@@ -166,12 +166,12 @@ func (s *pollServer) WakeFD(fd *netFD, mode int) {
        if mode == 'r' {
                for fd.ncr > 0 {
                        fd.ncr--
-                       fd.cr <- fd
+                       fd.cr <- true
                }
        } else {
                for fd.ncw > 0 {
                        fd.ncw--
-                       fd.cw <- fd
+                       fd.cw <- true
                }
        }
 }
@@ -312,8 +312,8 @@ func newFD(fd, family, proto int, net string, laddr, raddr Addr) (f *netFD, err
                rs = raddr.String()
        }
        f.sysfile = os.NewFile(fd, net+":"+ls+"->"+rs)
-       f.cr = make(chan *netFD, 1)
-       f.cw = make(chan *netFD, 1)
+       f.cr = make(chan bool, 1)
+       f.cw = make(chan bool, 1)
        return f, nil
 }