From e45a6ceda7aba83a1b1e877e588706a8ba814409 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet <juan@benet.ai> Date: Fri, 17 Oct 2014 02:01:47 -0700 Subject: [PATCH] can just use ctx.Done --- net/conn/conn.go | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/net/conn/conn.go b/net/conn/conn.go index 76c73aba..9acae54f 100644 --- a/net/conn/conn.go +++ b/net/conn/conn.go @@ -45,7 +45,6 @@ type singleConn struct { // context + cancel ctx context.Context cancel context.CancelFunc - closed chan struct{} secure *spipe.SecurePipe insecure *msgioPipe @@ -67,7 +66,6 @@ func newSingleConn(ctx context.Context, local, remote *peer.Peer, maconn: maconn, ctx: ctx, cancel: cancel, - closed: make(chan struct{}), insecure: newMsgioPipe(10), msgpipe: msg.NewPipe(10), } @@ -77,7 +75,7 @@ func newSingleConn(ctx context.Context, local, remote *peer.Peer, // setup the various io goroutines go conn.insecure.outgoing.WriteTo(maconn) go conn.insecure.incoming.ReadFrom(maconn, MaxMessageSize) - go conn.waitToClose(ctx) + go conn.waitToClose() // perform secure handshake before returning this connection. if err := conn.secureHandshake(peers); err != nil { @@ -101,12 +99,14 @@ func (c *singleConn) secureHandshake(peers peer.Peerstore) error { } // spipe performs the secure handshake, which takes multiple RTT - var err error - c.secure, err = spipe.NewSecurePipe(c.ctx, 10, c.local, peers, insecure) + sp, err := spipe.NewSecurePipe(c.ctx, 10, c.local, peers, insecure) if err != nil { return err } + // assign it into the conn object + c.secure = sp + if c.remote == nil { c.remote = c.secure.RemotePeer() @@ -157,9 +157,9 @@ func (c *singleConn) wrapInMsgs() { } // waitToClose waits on the given context's Done before closing Conn. -func (c *singleConn) waitToClose(ctx context.Context) { +func (c *singleConn) waitToClose() { select { - case <-ctx.Done(): + case <-c.ctx.Done(): } // close underlying connection @@ -167,15 +167,16 @@ func (c *singleConn) waitToClose(ctx context.Context) { // closing channels c.insecure.outgoing.Close() - c.secure.Close() + if c.secure != nil { // may never have gotten here. + c.secure.Close() + } close(c.msgpipe.Incoming) - close(c.closed) } // isClosed returns whether this Conn is open or closed. func (c *singleConn) isClosed() bool { select { - case <-c.closed: + case <-c.ctx.Done(): return true default: return false @@ -280,7 +281,6 @@ type listener struct { // ctx + cancel func ctx context.Context cancel context.CancelFunc - closed chan struct{} } // waitToClose is needed to hand @@ -290,12 +290,11 @@ func (l *listener) waitToClose() { } l.Listener.Close() - close(l.closed) } func (l *listener) isClosed() bool { select { - case <-l.closed: + case <-l.ctx.Done(): return true default: return false @@ -368,7 +367,6 @@ func (l *listener) Close() error { } l.cancel() - <-l.closed return nil } @@ -388,7 +386,6 @@ func Listen(ctx context.Context, addr ma.Multiaddr, local *peer.Peer, peers peer l := &listener{ ctx: ctx, cancel: cancel, - closed: make(chan struct{}), Listener: ml, maddr: addr, peers: peers, -- GitLab