go.net/netutil: LimitListener: avoid deadlock on multiple Close calls
R=golang-dev, dsymonds
CC=golang-dev
https://golang.org/cl/12967043
diff --git a/netutil/listen.go b/netutil/listen.go
index 754703f..b23c6e9 100644
--- a/netutil/listen.go
+++ b/netutil/listen.go
@@ -6,7 +6,10 @@
// common ones in the net package.
package netutil
-import "net"
+import (
+ "net"
+ "sync"
+)
// LimitListener returns a Listener that accepts at most n simultaneous
// connections from the provided Listener.
@@ -29,16 +32,19 @@
if err != nil {
return nil, err
}
- return &limitListenerConn{c, l.ch}, nil
+ return &limitListenerConn{Conn: c, ch: l.ch}, nil
}
type limitListenerConn struct {
net.Conn
- ch chan<- struct{}
+ ch chan<- struct{}
+ close sync.Once
}
func (l *limitListenerConn) Close() error {
err := l.Conn.Close()
- l.ch <- struct{}{}
+ l.close.Do(func() {
+ l.ch <- struct{}{}
+ })
return err
}