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
}
}