Selaa lähdekoodia

修复 chan 没有关闭的问题

Signed-off-by: allan716 <[email protected]>
allan716 3 vuotta sitten
vanhempi
sitoutus
3f5e3d4764

+ 4 - 0
internal/logic/emby_helper/embyhelper.go

@@ -622,6 +622,10 @@ func (em *EmbyHelper) getMoreVideoInfoList(videoIdList []string, isMovieOrSeries
 
 		done := make(chan OutData, 1)
 		panicChan := make(chan interface{}, 1)
+		defer func() {
+			close(done)
+			close(panicChan)
+		}()
 		go func() {
 			defer func() {
 				if p := recover(); p != nil {

+ 2 - 0
internal/logic/scan_played_video_subinfo/scan_played_video_subinfo.go

@@ -252,9 +252,11 @@ func (s *ScanPlayedVideoSubInfo) scan(ctx context.Context, inData interface{}) e
 		select {
 		case <-ctx.Done():
 			{
+				close(stage)
 				return errors.New(fmt.Sprintf("cancel at scan: %s", videoFPath))
 			}
 		case <-stage:
+			close(stage)
 			break
 		}
 	}

+ 28 - 2
internal/pkg/downloader/downloader.go

@@ -104,6 +104,12 @@ func (d *Downloader) SupplierCheck() {
 	done := make(chan interface{}, 1)
 	// 接收内部任务的 panic
 	panicChan := make(chan interface{}, 1)
+
+	defer func() {
+		close(done)
+		close(panicChan)
+	}()
+
 	go func() {
 		defer func() {
 			if p := recover(); p != nil {
@@ -204,6 +210,12 @@ func (d *Downloader) QueueDownloader() {
 	done := make(chan interface{}, 1)
 	// 接收内部任务的 panic
 	panicChan := make(chan interface{}, 1)
+
+	defer func() {
+		close(done)
+		close(panicChan)
+	}()
+
 	go func() {
 		defer func() {
 			if p := recover(); p != nil {
@@ -369,14 +381,21 @@ func (d *Downloader) seriesDlFunc(ctx context.Context, job taskQueue2.OneJob, do
 			} else {
 				save2LocalSubCount++
 			}
+			close(done)
+			close(panicChan)
 			break
 		case p := <-panicChan:
 			// 遇到内部的 panic,向外抛出
-			panic(p)
+			d.log.Errorln("seriesDlFunc.oneVideoSelectBestSub panicChan", p)
+			close(done)
+			close(panicChan)
+			break
 		case <-ctx.Done():
 			{
 				err = errors.New(fmt.Sprintf("cancel at NeedDlEpsKeyList.oneVideoSelectBestSub, %v S%dE%d", seriesInfo.Name, episodeInfo.Season, episodeInfo.Episode))
 				d.downloadQueue.AutoDetectUpdateJobStatus(job, err)
+				close(done)
+				close(panicChan)
 				return err
 			}
 		}
@@ -417,14 +436,21 @@ func (d *Downloader) seriesDlFunc(ctx context.Context, job taskQueue2.OneJob, do
 			} else {
 				save2LocalSubCount++
 			}
+			close(done)
+			close(panicChan)
 			break
 		case p := <-panicChan:
 			// 遇到内部的 panic,向外抛出
-			panic(p)
+			d.log.Errorln("seriesDlFunc.oneVideoSelectBestSub panicChan", p)
+			close(done)
+			close(panicChan)
+			break
 		case <-ctx.Done():
 			{
 				err = errors.New(fmt.Sprintf("cancel at NeedDlEpsKeyList.oneVideoSelectBestSub, %v S%dE%d", seriesInfo.Name, episodeInfo.Season, episodeInfo.Episode))
 				d.downloadQueue.AutoDetectUpdateJobStatus(job, err)
+				close(done)
+				close(panicChan)
 				return err
 			}
 		}

+ 6 - 0
internal/pkg/emby_api/emby_api.go

@@ -59,6 +59,12 @@ func (em EmbyApi) RefreshRecentlyVideoInfo() error {
 
 		done := make(chan error, 1)
 		panicChan := make(chan interface{}, 1)
+
+		defer func() {
+			close(done)
+			close(panicChan)
+		}()
+
 		go func() {
 			defer func() {
 				if p := recover(); p != nil {

+ 6 - 0
internal/pkg/task_control/task_control.go

@@ -127,6 +127,12 @@ func (tc *TaskControl) baseFuncHandler(inData interface{}) {
 
 	done := make(chan error, 1)
 	panicChan := make(chan interface{}, 1)
+
+	defer func() {
+		close(done)
+		close(panicChan)
+	}()
+
 	go func(ctx context.Context) {
 		defer func() {
 			if p := recover(); p != nil {

+ 3 - 0
internal/pkg/task_control/task_control_test.go

@@ -311,6 +311,9 @@ func process(name string, timeTester TimeTester) ([]int, []int, []int, error) {
 func waitTimes(ctx context.Context, inData interface{}) error {
 
 	phase0 := make(chan interface{}, 1)
+	defer func() {
+		close(phase0)
+	}()
 	index := inData.(*TaskData)
 
 	dataEx := index.DataEx.(DataEx)