OSDN Git Service

new repo
[bytom/vapor.git] / vendor / golang.org / x / net / netutil / listen.go
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.
4
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"
8
9 import (
10         "net"
11         "sync"
12 )
13
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)}
18 }
19
20 type limitListener struct {
21         net.Listener
22         sem chan struct{}
23 }
24
25 func (l *limitListener) acquire() { l.sem <- struct{}{} }
26 func (l *limitListener) release() { <-l.sem }
27
28 func (l *limitListener) Accept() (net.Conn, error) {
29         l.acquire()
30         c, err := l.Listener.Accept()
31         if err != nil {
32                 l.release()
33                 return nil, err
34         }
35         return &limitListenerConn{Conn: c, release: l.release}, nil
36 }
37
38 type limitListenerConn struct {
39         net.Conn
40         releaseOnce sync.Once
41         release     func()
42 }
43
44 func (l *limitListenerConn) Close() error {
45         err := l.Conn.Close()
46         l.releaseOnce.Do(l.release)
47         return err
48 }