Skip to content

Commit

Permalink
Merge pull request #58 from ipfs/fix/ping-leak
Browse files Browse the repository at this point in the history
don't leak goroutines when pings complete
  • Loading branch information
whyrusleeping committed May 30, 2016
2 parents 97fbccf + f483c47 commit 71aefe1
Showing 1 changed file with 20 additions and 0 deletions.
20 changes: 20 additions & 0 deletions p2p/protocol/ping/ping.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand All @@ -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 {
Expand All @@ -45,6 +62,8 @@ func (p *PingService) PingHandler(s inet.Stream) {
log.Debug(err)
return
}

timer.Reset(pingTimeout)
}
}

Expand All @@ -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():
Expand Down

0 comments on commit 71aefe1

Please sign in to comment.