From 019f68854638e1a7043f2b403c66bf9ef5f6f198 Mon Sep 17 00:00:00 2001 From: Patrick Fuchs Date: Fri, 20 Mar 2026 15:07:31 +0200 Subject: [PATCH] Fix spinner race condition --- output/spinner.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/output/spinner.go b/output/spinner.go index 4ff870728..6776657e9 100644 --- a/output/spinner.go +++ b/output/spinner.go @@ -20,12 +20,14 @@ package output import ( "fmt" + "sync" "time" "github.com/gosuri/uilive" ) var spinnerCharset = []rune{'⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'} +var mu = sync.Mutex{} type Spinner struct { prefix string @@ -46,7 +48,10 @@ func (s *Spinner) Start() { } func (s *Spinner) run() { + mu.Lock() + // writes to global variable, need a global lock to avoid race conditions writer := uilive.New() + mu.Unlock() ticker := time.NewTicker(100 * time.Millisecond) @@ -56,7 +61,10 @@ func (s *Spinner) run() { select { case <-s.done: _, _ = fmt.Fprintf(writer, "\r") + mu.Lock() + // writes to global variable, need a global lock to avoid race conditions _ = writer.Flush() + mu.Unlock() close(s.done) return case <-ticker.C: