Skip to content

Commit

Permalink
fix: clean-up the rate sequence goroutines to avoid leaking (#142)
Browse files Browse the repository at this point in the history
As stated on Ticker.Stop:

    Stop does not close the channel, to prevent a concurrent goroutine
    reading from the channel from seeing an erroneous "tick".

This sole fact prevents the goroutine from exiting, and in result,
causes a leak that is especially problematic when the project is used as
through an API and not a CLI.
  • Loading branch information
d1823 authored Aug 23, 2023
1 parent 1ed6602 commit b55ef77
Showing 1 changed file with 20 additions and 12 deletions.
32 changes: 20 additions & 12 deletions speedtest/data_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -225,18 +225,26 @@ func (dm *DataManager) rateCapture() *time.Ticker {
oldTotalDownload := dm.totalDownload
oldTotalUpload := dm.totalUpload
go func() {
for range ticker.C {
newTotalDownload := dm.totalDownload
newTotalUpload := dm.totalUpload
deltaDownload := newTotalDownload - oldTotalDownload
deltaUpload := newTotalUpload - oldTotalUpload
oldTotalDownload = newTotalDownload
oldTotalUpload = newTotalUpload
if deltaDownload != 0 {
dm.DownloadRateSequence = append(dm.DownloadRateSequence, deltaDownload)
}
if deltaUpload != 0 {
dm.UploadRateSequence = append(dm.UploadRateSequence, deltaUpload)
loop:
for {
select {
case <-ticker.C:
newTotalDownload := dm.totalDownload
newTotalUpload := dm.totalUpload
deltaDownload := newTotalDownload - oldTotalDownload
deltaUpload := newTotalUpload - oldTotalUpload
oldTotalDownload = newTotalDownload
oldTotalUpload = newTotalUpload
if deltaDownload != 0 {
dm.DownloadRateSequence = append(dm.DownloadRateSequence, deltaDownload)
}
if deltaUpload != 0 {
dm.UploadRateSequence = append(dm.UploadRateSequence, deltaUpload)
}
default:
if !dm.running {
break loop
}
}
}
}()
Expand Down

0 comments on commit b55ef77

Please sign in to comment.