diff --git a/bar.go b/bar.go index 6551fba..55a9f49 100644 --- a/bar.go +++ b/bar.go @@ -315,8 +315,15 @@ // if you need to adjust start time of all average based decorators // or after progress resume. func (b *Bar) DecoratorAverageAdjust(start time.Time) { - select { - case b.operateState <- func(s *bState) { s.decoratorAverageAdjust(start) }: + result := make(chan *sync.WaitGroup) + select { + case b.operateState <- func(s *bState) { + var wg sync.WaitGroup + s.decoratorAverageAdjust(start, &wg) + result <- &wg + }: + wg := <-result + wg.Wait() case <-b.ctx.Done(): } } @@ -565,21 +572,20 @@ wg.Wait() } -func (s bState) decoratorAverageAdjust(start time.Time) { - var wg sync.WaitGroup +func (s bState) decoratorAverageAdjust(start time.Time, wg *sync.WaitGroup) { for i := 0; i < len(s.averageDecorators); i++ { + wg.Add(1) switch d := s.averageDecorators[i]; i { case len(s.averageDecorators) - 1: d.AverageAdjust(start) + wg.Done() default: - wg.Add(1) go func() { d.AverageAdjust(start) wg.Done() }() } } - wg.Wait() } func (s bState) decoratorShutdownNotify(wg *sync.WaitGroup) {