don't leak goroutines when pings complete

This commit is contained in:
Jeromy 2016-05-30 12:39:30 -07:00
parent 97fbccffca
commit f483c47187
1 changed files with 20 additions and 0 deletions

View File

@ -20,6 +20,8 @@ const PingSize = 32
const ID = "/ipfs/ping/1.0.0"
const pingTimeout = time.Second * 60
type PingService struct {
Host host.Host
}
@ -31,8 +33,23 @@ func NewPingService(h host.Host) *PingService {
}
func (p *PingService) PingHandler(s inet.Stream) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
buf := make([]byte, PingSize)
timer := time.NewTimer(pingTimeout)
defer timer.Stop()
go func() {
select {
case <-timer.C:
case <-ctx.Done():
}
s.Close()
}()
for {
_, err := io.ReadFull(s, buf)
if err != nil {
@ -45,6 +62,8 @@ func (p *PingService) PingHandler(s inet.Stream) {
log.Debug(err)
return
}
timer.Reset(pingTimeout)
}
}
@ -57,6 +76,7 @@ func (ps *PingService) Ping(ctx context.Context, p peer.ID) (<-chan time.Duratio
out := make(chan time.Duration)
go func() {
defer close(out)
defer s.Close()
for {
select {
case <-ctx.Done():