diff --git a/progress.go b/progress.go index 510d902..7c39249 100644 --- a/progress.go +++ b/progress.go @@ -216,7 +216,12 @@ bf := <-ch _, err = s.cw.ReadFrom(bf.reader) if !bf.bar.completed && bf.toComplete { - bf.bar.completed = true + // shutdown at next flush, in other words decrement underlying WaitGroup + // only after the bar with completed state has been flushed. + // this ensures no bar ends up with less than 100% rendered. + defer func() { + s.shutdownPending = append(s.shutdownPending, bf.bar) + }() if bf.bar.removeOnComplete { s.heapUpdated = heap.Remove(s.bHeap, bf.bar.index) != nil } @@ -225,10 +230,7 @@ s.heapUpdated = true delete(s.waitBars, bf.bar) } - // defer is required to make removeOnComplete visually happen - defer func() { - s.shutdownPending = append(s.shutdownPending, bf.bar) - }() + bf.bar.completed = true } }