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,