|
|
@@ -11,26 +11,39 @@ import (
|
|
|
|
|
|
type OutboundListener struct {
|
|
|
buffer chan net.Conn
|
|
|
+ done *signal.Done
|
|
|
}
|
|
|
|
|
|
func (l *OutboundListener) add(conn net.Conn) {
|
|
|
select {
|
|
|
case l.buffer <- conn:
|
|
|
+ case <-l.done.C():
|
|
|
+ conn.Close()
|
|
|
default:
|
|
|
conn.Close()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
func (l *OutboundListener) Accept() (net.Conn, error) {
|
|
|
- c, open := <-l.buffer
|
|
|
- if !open {
|
|
|
- return nil, newError("listener closed")
|
|
|
+ select {
|
|
|
+ case <-l.done.C():
|
|
|
+ return nil, newError("listern closed")
|
|
|
+ case c := <-l.buffer:
|
|
|
+ return c, nil
|
|
|
}
|
|
|
- return c, nil
|
|
|
}
|
|
|
|
|
|
func (l *OutboundListener) Close() error {
|
|
|
- close(l.buffer)
|
|
|
+ l.done.Close()
|
|
|
+L:
|
|
|
+ for {
|
|
|
+ select {
|
|
|
+ case c := <-l.buffer:
|
|
|
+ c.Close()
|
|
|
+ default:
|
|
|
+ break L
|
|
|
+ }
|
|
|
+ }
|
|
|
return nil
|
|
|
}
|
|
|
|