From 55ee2f57ae13654891ae3c02470bdb10cd2a4e54 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Tue, 11 Jun 2024 11:16:55 +0200 Subject: [PATCH] The number of jobs in library detection now follows --jobs flag --- internal/arduino/builder/builder.go | 1 + internal/arduino/builder/internal/detector/detector.go | 8 +++++--- internal/arduino/builder/internal/runner/runner.go | 9 +++++++-- internal/arduino/builder/internal/runner/runner_test.go | 2 +- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/internal/arduino/builder/builder.go b/internal/arduino/builder/builder.go index 37ddeae2332..4116b9a4739 100644 --- a/internal/arduino/builder/builder.go +++ b/internal/arduino/builder/builder.go @@ -321,6 +321,7 @@ func (b *Builder) preprocess() error { b.librariesBuildPath, b.buildProperties, b.targetPlatform.Platform.Architecture, + b.jobs, ) if err != nil { return err diff --git a/internal/arduino/builder/internal/detector/detector.go b/internal/arduino/builder/internal/detector/detector.go index c2b3b70315f..17a70ebf359 100644 --- a/internal/arduino/builder/internal/detector/detector.go +++ b/internal/arduino/builder/internal/detector/detector.go @@ -191,8 +191,9 @@ func (l *SketchLibrariesDetector) FindIncludes( librariesBuildPath *paths.Path, buildProperties *properties.Map, platformArch string, + jobs int, ) error { - err := l.findIncludes(ctx, buildPath, buildCorePath, buildVariantPath, sketchBuildPath, sketch, librariesBuildPath, buildProperties, platformArch) + err := l.findIncludes(ctx, buildPath, buildCorePath, buildVariantPath, sketchBuildPath, sketch, librariesBuildPath, buildProperties, platformArch, jobs) if err != nil && l.onlyUpdateCompilationDatabase { l.logger.Info( fmt.Sprintf( @@ -216,6 +217,7 @@ func (l *SketchLibrariesDetector) findIncludes( librariesBuildPath *paths.Path, buildProperties *properties.Map, platformArch string, + jobs int, ) error { librariesResolutionCache := buildPath.Join("libraries.cache") if l.useCachedLibrariesResolution && librariesResolutionCache.Exist() { @@ -238,7 +240,7 @@ func (l *SketchLibrariesDetector) findIncludes( } // Pre-run cache entries - l.preRunner = runner.New(ctx) + l.preRunner = runner.New(ctx, jobs) for _, entry := range l.cache.EntriesAhead() { if entry.Compile != nil && entry.CompileTask != nil { upToDate, _ := entry.Compile.ObjFileIsUpToDate() @@ -279,7 +281,7 @@ func (l *SketchLibrariesDetector) findIncludes( // Create a new pre-runner if the previous one was cancelled if l.preRunner == nil { - l.preRunner = runner.New(ctx) + l.preRunner = runner.New(ctx, jobs) // Push in the remainder of the queue for _, sourceFile := range *sourceFileQueue { l.preRunner.Enqueue(l.gccPreprocessTask(sourceFile, buildProperties)) diff --git a/internal/arduino/builder/internal/runner/runner.go b/internal/arduino/builder/internal/runner/runner.go index d34d3df3b28..89565bdbc4c 100644 --- a/internal/arduino/builder/internal/runner/runner.go +++ b/internal/arduino/builder/internal/runner/runner.go @@ -41,7 +41,9 @@ func (cmd *enqueuedCommand) String() string { return cmd.task.String() } -func New(inCtx context.Context) *Runner { +// New creates a new Runner with the given number of workers. +// If workers is 0, the number of workers will be the number of available CPUs. +func New(inCtx context.Context, workers int) *Runner { ctx, cancel := context.WithCancel(inCtx) queue := make(chan *enqueuedCommand, 1000) r := &Runner{ @@ -52,7 +54,10 @@ func New(inCtx context.Context) *Runner { } // Spawn workers - for i := 0; i < runtime.NumCPU(); i++ { + if workers == 0 { + workers = runtime.NumCPU() + } + for i := 0; i < workers; i++ { r.wg.Add(1) go func() { worker(ctx, queue) diff --git a/internal/arduino/builder/internal/runner/runner_test.go b/internal/arduino/builder/internal/runner/runner_test.go index 90a72d4654a..ed499299912 100644 --- a/internal/arduino/builder/internal/runner/runner_test.go +++ b/internal/arduino/builder/internal/runner/runner_test.go @@ -28,7 +28,7 @@ import ( func TestRunMultipleTask(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() - r := runner.New(ctx) + r := runner.New(ctx, 0) r.Enqueue(runner.NewTask("bash", "-c", "sleep 1 ; echo -n 0")) r.Enqueue(runner.NewTask("bash", "-c", "sleep 2 ; echo -n 1")) r.Enqueue(runner.NewTask("bash", "-c", "sleep 3 ; echo -n 2"))