func worker()

in clang/clang.go [56:118]


func worker(
	c thirdpartyscan.Context,
	filesAndCompilers []FileWithHeaders,
	checks string,
	spin *spinner.Spinner,
	stdoutChannel, stderrChannel chan string,
) {
	spin.Start()
	spin.Suffix = fmt.Sprintf(" %d/%d", 0, len(filesAndCompilers))

	defer close(stdoutChannel)
	defer close(stderrChannel)

	var wg sync.WaitGroup
	progressCounter := int32(0)
	sem := make(chan bool, runtime.NumCPU())
	quit := make(chan os.Signal, 1)
	finished := make(chan bool)
	signal.Notify(quit, os.Interrupt)

	go func() {
		for counter, fileWithHeader := range filesAndCompilers {
			select {
			case <-quit:
				fmt.Println("Interrupt signal received. Exiting function.")
				spin.Stop()
				finished <- true
				return
			default:
				wg.Add(1)
				go func(counter int, input FileWithHeaders) {
					defer wg.Done()
					sem <- true
					spin.Suffix = fmt.Sprintf(" %d/%d", atomic.AddInt32(&progressCounter, 1), len(filesAndCompilers))
					spin.Restart()
					defer func() { <-sem }()

					err := runClangTidy(
						counter,
						input,
						checks,
						c,
						platform.GetTmpResultsDir(c.ResultsDir()),
						stderrChannel,
						stdoutChannel,
					)
					if err != nil {
						log.Errorf("Error running clang-tidy: %s", err)
					}
				}(counter, fileWithHeader)
			}
		}
		wg.Wait()
		spin.Stop()
		finished <- true
	}()
	select {
	case <-quit:
		return
	case <-finished:
		return
	}
}