builder: refactor job runner and use a shared semaphore across build jobs

Switching to a shared semaphore allows multi-build operations (compiler tests, package tests, etc.) to use the expected degree of parallelism efficiently.

While refactoring the job runner, the time complexity was also reduced from O(n^2) to O(n+m) (where n is the number of jobs, and m is the number of dependencies).
This commit is contained in:
Nia Waldvogel
2021-12-24 13:19:39 -05:00
committed by Nia
parent bb08a25edc
commit e594dbc133
6 changed files with 151 additions and 115 deletions
+2 -2
View File
@@ -489,7 +489,7 @@ func Build(pkgName, outpath string, config *compileopts.Config, action func(Buil
outext := filepath.Ext(outpath)
if outext == ".o" || outext == ".bc" || outext == ".ll" {
// Run jobs to produce the LLVM module.
err := runJobs(programJob, config.Options.Parallelism)
err := runJobs(programJob, config.Options.Semaphore)
if err != nil {
return err
}
@@ -751,7 +751,7 @@ func Build(pkgName, outpath string, config *compileopts.Config, action func(Buil
// Run all jobs to compile and link the program.
// Do this now (instead of after elf-to-hex and similar conversions) as it
// is simpler and cannot be parallelized.
err = runJobs(linkJob, config.Options.Parallelism)
err = runJobs(linkJob, config.Options.Semaphore)
if err != nil {
return err
}