1 // Copyright 2013 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 // Package netutil provides network utility functions, complementing the more
6 // common ones in the net package.
7 package netutil // import "golang.org/x/net/netutil"
14 // LimitListener returns a Listener that accepts at most n simultaneous
15 // connections from the provided Listener.
16 func LimitListener(l net.Listener, n int) net.Listener {
17 return &limitListener{l, make(chan struct{}, n)}
20 type limitListener struct {
25 func (l *limitListener) acquire() { l.sem <- struct{}{} }
26 func (l *limitListener) release() { <-l.sem }
28 func (l *limitListener) Accept() (net.Conn, error) {
30 c, err := l.Listener.Accept()
35 return &limitListenerConn{Conn: c, release: l.release}, nil
38 type limitListenerConn struct {
44 func (l *limitListenerConn) Close() error {
46 l.releaseOnce.Do(l.release)