From b621f7cb3fed8334b4175c2c806f0b69dc545d31 Mon Sep 17 00:00:00 2001
From: r3inbowari <r3inbowari@gmail.com>
Date: Sun, 10 Sep 2023 12:37:46 +0800
Subject: [PATCH] fix: unexpected signal kill on some linux releases (#150)

* fix: unexpected signal kill on some linux releases

* Release v1.6.6
---
 speedtest/data_manager.go | 24 +++++++++++++-----------
 speedtest/speedtest.go    |  2 +-
 2 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/speedtest/data_manager.go b/speedtest/data_manager.go
index 23cc753..47ce8b8 100644
--- a/speedtest/data_manager.go
+++ b/speedtest/data_manager.go
@@ -176,9 +176,10 @@ func (f *funcGroup) Start(cancel context.CancelFunc, mainRequestHandlerIndex int
 	dbg.Printf("auxN: %d\n", auxN)
 	wg := sync.WaitGroup{}
 	f.manager.running = true
-	ticker := f.manager.rateCapture()
+	stopCapture := f.manager.rateCapture()
 	time.AfterFunc(f.manager.captureTime, func() {
-		ticker.Stop()
+		stopCapture <- true
+		close(stopCapture)
 		f.manager.running = false
 		cancel()
 		dbg.Println("FuncGroup: Stop")
@@ -220,15 +221,16 @@ func (f *funcGroup) Start(cancel context.CancelFunc, mainRequestHandlerIndex int
 	wg.Wait()
 }
 
-func (dm *DataManager) rateCapture() *time.Ticker {
+func (dm *DataManager) rateCapture() chan bool {
 	ticker := time.NewTicker(dm.rateCaptureFrequency)
 	oldTotalDownload := dm.totalDownload
 	oldTotalUpload := dm.totalUpload
-	go func() {
-	loop:
+	stopCapture := make(chan bool)
+	go func(t *time.Ticker) {
+		defer t.Stop()
 		for {
 			select {
-			case <-ticker.C:
+			case <-t.C:
 				newTotalDownload := dm.totalDownload
 				newTotalUpload := dm.totalUpload
 				deltaDownload := newTotalDownload - oldTotalDownload
@@ -241,14 +243,14 @@ func (dm *DataManager) rateCapture() *time.Ticker {
 				if deltaUpload != 0 {
 					dm.UploadRateSequence = append(dm.UploadRateSequence, deltaUpload)
 				}
-			default:
-				if !dm.running {
-					break loop
+			case stop := <-stopCapture:
+				if stop {
+					return
 				}
 			}
 		}
-	}()
-	return ticker
+	}(ticker)
+	return stopCapture
 }
 
 func (dm *DataManager) NewChunk() Chunk {
diff --git a/speedtest/speedtest.go b/speedtest/speedtest.go
index c9177d6..5a64f05 100644
--- a/speedtest/speedtest.go
+++ b/speedtest/speedtest.go
@@ -11,7 +11,7 @@ import (
 )
 
 var (
-	version          = "1.6.5"
+	version          = "1.6.6"
 	DefaultUserAgent = fmt.Sprintf("showwin/speedtest-go %s", version)
 )