github.com/pmorton/docker@v1.5.0/pkg/listenbuffer/buffer.go (about) 1 /* 2 Package to allow go applications to immediately start 3 listening on a socket, unix, tcp, udp but hold connections 4 until the application has booted and is ready to accept them 5 */ 6 package listenbuffer 7 8 import "net" 9 10 // NewListenBuffer returns a listener listening on addr with the protocol. 11 func NewListenBuffer(proto, addr string, activate chan struct{}) (net.Listener, error) { 12 wrapped, err := net.Listen(proto, addr) 13 if err != nil { 14 return nil, err 15 } 16 17 return &defaultListener{ 18 wrapped: wrapped, 19 activate: activate, 20 }, nil 21 } 22 23 type defaultListener struct { 24 wrapped net.Listener // the real listener to wrap 25 ready bool // is the listner ready to start accpeting connections 26 activate chan struct{} 27 } 28 29 func (l *defaultListener) Close() error { 30 return l.wrapped.Close() 31 } 32 33 func (l *defaultListener) Addr() net.Addr { 34 return l.wrapped.Addr() 35 } 36 37 func (l *defaultListener) Accept() (net.Conn, error) { 38 // if the listen has been told it is ready then we can go ahead and 39 // start returning connections 40 if l.ready { 41 return l.wrapped.Accept() 42 } 43 <-l.activate 44 l.ready = true 45 return l.Accept() 46 }