From 76b5c1995fb75870f3fc09eb7911bd334fd8e55d Mon Sep 17 00:00:00 2001 From: Brett Wandel Date: Fri, 19 Apr 2019 17:10:36 +1000 Subject: [PATCH] fixed: small changes to cancellation on ctrl-c --- command/build.go | 46 ++++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/command/build.go b/command/build.go index e9daa1074..aef22a33c 100644 --- a/command/build.go +++ b/command/build.go @@ -156,39 +156,41 @@ func (c *BuildCommand) Run(args []string) int { if cfgParallel < 1 { cfgParallel = math.MaxInt64 } + + buildCtx, cancelCtx := context.WithCancel(context.Background()) + // Handle interrupts for this build + sigCh := make(chan os.Signal, 1) + signal.Notify(sigCh, os.Interrupt, syscall.SIGTERM) + defer signal.Stop(sigCh) + go func() { + sig := <-sigCh + interruptWg.Add(1) + defer interruptWg.Done() + interrupted = true + + cancelCtx() + c.Ui.Error(fmt.Sprintf("Cancelling build after receiving %s", sig)) + }() + limitParallel := semaphore.NewWeighted(cfgParallel) for _, b := range builds { // Increment the waitgroup so we wait for this item to finish properly wg.Add(1) - buildCtx, cancelCtx := context.WithCancel(context.Background()) - if err := limitParallel.Acquire(buildCtx, 1); err != nil { - log.Printf("Stopping build: failed to acquire semaphore %s", err) - return 1 - } - - // Handle interrupts for this build - sigCh := make(chan os.Signal, 1) - signal.Notify(sigCh, os.Interrupt, syscall.SIGTERM) - defer signal.Stop(sigCh) - go func(b packer.Build) { - sig := <-sigCh - interruptWg.Add(1) - defer interruptWg.Done() - interrupted = true - - log.Printf("Stopping build: %s after receiving %s", b.Name(), sig) - cancelCtx() - log.Printf("Build cancelled: %s", b.Name()) - }(b) // Run the build in a goroutine go func(b packer.Build) { defer wg.Done() - defer limitParallel.Release(1) name := b.Name() - log.Printf("Starting build run: %s", name) ui := buildUis[name] + + if err := limitParallel.Acquire(buildCtx, 1); err != nil { + ui.Error(fmt.Sprintf("Build '%s' failed to acquire semaphore: %s", name, err)) + return + } + defer limitParallel.Release(1) + + log.Printf("Starting build run: %s", name) runArtifacts, err := b.Run(buildCtx, ui) if err != nil {