@@ -112,6 +112,7 @@ type Peer struct {
112
112
wg sync.WaitGroup
113
113
protoErr chan error
114
114
closed chan struct {}
115
+ pingRecv chan struct {}
115
116
disc chan DiscReason
116
117
117
118
// events receives message send / receive events if set
@@ -233,6 +234,7 @@ func newPeer(log log.Logger, conn *conn, protocols []Protocol) *Peer {
233
234
disc : make (chan DiscReason ),
234
235
protoErr : make (chan error , len (protomap )+ 1 ), // protocols + pingLoop
235
236
closed : make (chan struct {}),
237
+ pingRecv : make (chan struct {}, 16 ),
236
238
log : log .New ("id" , conn .node .ID (), "conn" , conn .flags ),
237
239
}
238
240
return p
@@ -293,9 +295,11 @@ loop:
293
295
}
294
296
295
297
func (p * Peer ) pingLoop () {
296
- ping := time .NewTimer (pingInterval )
297
298
defer p .wg .Done ()
299
+
300
+ ping := time .NewTimer (pingInterval )
298
301
defer ping .Stop ()
302
+
299
303
for {
300
304
select {
301
305
case <- ping .C :
@@ -304,6 +308,10 @@ func (p *Peer) pingLoop() {
304
308
return
305
309
}
306
310
ping .Reset (pingInterval )
311
+
312
+ case <- p .pingRecv :
313
+ SendItems (p .rw , pongMsg )
314
+
307
315
case <- p .closed :
308
316
return
309
317
}
@@ -330,7 +338,10 @@ func (p *Peer) handle(msg Msg) error {
330
338
switch {
331
339
case msg .Code == pingMsg :
332
340
msg .Discard ()
333
- go SendItems (p .rw , pongMsg )
341
+ select {
342
+ case p .pingRecv <- struct {}{}:
343
+ case <- p .closed :
344
+ }
334
345
case msg .Code == discMsg :
335
346
// This is the last message. We don't need to discard or
336
347
// check errors because, the connection will be closed after it.
0 commit comments