diff --git a/pkg/progressreader/broadcaster.go b/pkg/progressreader/broadcaster.go index 58604aa44b..a48ff226db 100644 --- a/pkg/progressreader/broadcaster.go +++ b/pkg/progressreader/broadcaster.go @@ -24,9 +24,6 @@ type Broadcaster struct { history [][]byte // wg is a WaitGroup used to wait for all writes to finish on Close wg sync.WaitGroup - // isClosed is set to true when Close is called to avoid closing c - // multiple times. - isClosed bool // result is the argument passed to the first call of Close, and // returned to callers of Wait result error @@ -141,11 +138,10 @@ func (broadcaster *Broadcaster) Add(w io.Writer) error { // argument is a result that should be returned to waiters blocking on Wait. func (broadcaster *Broadcaster) CloseWithError(result error) { broadcaster.Lock() - if broadcaster.isClosed { + if broadcaster.closed() { broadcaster.Unlock() return } - broadcaster.isClosed = true broadcaster.result = result close(broadcaster.c) broadcaster.cond.Broadcast() @@ -161,9 +157,11 @@ func (broadcaster *Broadcaster) Close() { broadcaster.CloseWithError(nil) } -// Wait blocks until the operation is marked as completed by the Done method. -// It returns the argument that was passed to Close. +// Wait blocks until the operation is marked as completed by the Close method, +// and all writer goroutines have completed. It returns the argument that was +// passed to Close. func (broadcaster *Broadcaster) Wait() error { <-broadcaster.c + broadcaster.wg.Wait() return broadcaster.result }