@cryptotaxi247 / kubo / commits / e45a6ceda

can just use ctx.Done

Juan Batiz-Benet committed Oct 17, 2014 at 02:01 UTC e45a6ceda7aba83a1b1e877e588706a8ba814409
1 file changed +12 -15
net/conn/conn.go
+12 -15
@@ -45,7 +45,6 @@ type singleConn struct {
45 // context + cancel
46 ctx context.Context
47 cancel context.CancelFunc
48 - closed chan struct{}
48
49 secure *spipe.SecurePipe
50 insecure *msgioPipe
@@ -67,7 +66,6 @@ func newSingleConn(ctx context.Context, local, remote *peer.Peer,
66 maconn: maconn,
67 ctx: ctx,
68 cancel: cancel,
70 - closed: make(chan struct{}),
69 insecure: newMsgioPipe(10),
70 msgpipe: msg.NewPipe(10),
71 }
@@ -77,7 +75,7 @@ func newSingleConn(ctx context.Context, local, remote *peer.Peer,
75 // setup the various io goroutines
76 go conn.insecure.outgoing.WriteTo(maconn)
77 go conn.insecure.incoming.ReadFrom(maconn, MaxMessageSize)
80 - go conn.waitToClose(ctx)
78 + go conn.waitToClose()
79
80 // perform secure handshake before returning this connection.
81 if err := conn.secureHandshake(peers); err != nil {
@@ -101,12 +99,14 @@ func (c *singleConn) secureHandshake(peers peer.Peerstore) error {
99 }
100
101 // spipe performs the secure handshake, which takes multiple RTT
104 - var err error
105 - c.secure, err = spipe.NewSecurePipe(c.ctx, 10, c.local, peers, insecure)
102 + sp, err := spipe.NewSecurePipe(c.ctx, 10, c.local, peers, insecure)
103 if err != nil {
104 return err
105 }
106
107 + // assign it into the conn object
108 + c.secure = sp
109 +
110 if c.remote == nil {
111 c.remote = c.secure.RemotePeer()
112
@@ -157,9 +157,9 @@ func (c *singleConn) wrapInMsgs() {
157 }
158
159 // waitToClose waits on the given context's Done before closing Conn.
160 -func (c *singleConn) waitToClose(ctx context.Context) {
160 +func (c *singleConn) waitToClose() {
161 select {
162 - case <-ctx.Done():
162 + case <-c.ctx.Done():
163 }
164
165 // close underlying connection
@@ -167,15 +167,16 @@ func (c *singleConn) waitToClose(ctx context.Context) {
167
168 // closing channels
169 c.insecure.outgoing.Close()
170 - c.secure.Close()
170 + if c.secure != nil { // may never have gotten here.
171 + c.secure.Close()
172 + }
173 close(c.msgpipe.Incoming)
172 - close(c.closed)
174 }
175
176 // isClosed returns whether this Conn is open or closed.
177 func (c *singleConn) isClosed() bool {
178 select {
178 - case <-c.closed:
179 + case <-c.ctx.Done():
180 return true
181 default:
182 return false
@@ -280,7 +281,6 @@ type listener struct {
281 // ctx + cancel func
282 ctx context.Context
283 cancel context.CancelFunc
283 - closed chan struct{}
284 }
285
286 // waitToClose is needed to hand
@@ -290,12 +290,11 @@ func (l *listener) waitToClose() {
290 }
291
292 l.Listener.Close()
293 - close(l.closed)
293 }
294
295 func (l *listener) isClosed() bool {
296 select {
298 - case <-l.closed:
297 + case <-l.ctx.Done():
298 return true
299 default:
300 return false
@@ -368,7 +367,6 @@ func (l *listener) Close() error {
367 }
368
369 l.cancel()
371 - <-l.closed
370 return nil
371 }
372
@@ -388,7 +386,6 @@ func Listen(ctx context.Context, addr ma.Multiaddr, local *peer.Peer, peers peer
386 l := &listener{
387 ctx: ctx,
388 cancel: cancel,
391 - closed: make(chan struct{}),
389 Listener: ml,
390 maddr: addr,
391 peers: peers,