diff --git a/bar.go b/bar.go index 00f9115..aef1ca0 100644 --- a/bar.go +++ b/bar.go @@ -321,7 +321,7 @@ frame = io.MultiReader(frame, s.bufE) } - b.toDrop = s.dropOnComplete + // b.toDrop = s.dropOnComplete b.toShutdown = s.toComplete && !s.completeFlushed s.completeFlushed = s.toComplete @@ -411,12 +411,12 @@ } } -func (b *Bar) dropOnComplete() { - select { - case b.operateState <- func(s *bState) { s.dropOnComplete = true }: - case <-b.done: - } -} +// func (b *Bar) dropOnComplete() { +// select { +// case b.operateState <- func(s *bState) { s.dropOnComplete = true }: +// case <-b.done: +// } +// } func newStatistics(s *bState) *decor.Statistics { return &decor.Statistics{ diff --git a/progress.go b/progress.go index e391f83..1cbb2ae 100644 --- a/progress.go +++ b/progress.go @@ -38,7 +38,7 @@ heapUpdated bool pMatrix map[int][]chan int aMatrix map[int][]chan int - barShutdownQueue []func() + barShutdownQueue []*Bar // following are provided/overrided by user idCount int @@ -156,7 +156,8 @@ if b.index < 0 { return } - s.heapUpdated = heap.Remove(&s.bHeap, b.index) != nil + heap.Remove(&s.bHeap, b.index) + s.heapUpdated = true }: case <-p.done: } @@ -254,35 +255,52 @@ } func (s *pState) flush(cw *cwriter.Writer) error { + var rpop bool var lineCount int - for s.bHeap.Len() > 0 { + hlen := s.bHeap.Len() + tmp := make([]*Bar, hlen) + for i := 0; i < hlen; i++ { bar := heap.Pop(&s.bHeap).(*Bar) defer func() { if bar.toShutdown { // 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. - s.barShutdownQueue = append(s.barShutdownQueue, bar.cancel) - if parkedBar := s.parkedBars[bar]; parkedBar != nil { - heap.Push(&s.bHeap, parkedBar) - s.heapUpdated = true - delete(s.parkedBars, bar) - } - if bar.toDrop { - s.heapUpdated = true - return - } - } - heap.Push(&s.bHeap, bar) + s.barShutdownQueue = append(s.barShutdownQueue, bar) + // if parkedBar := s.parkedBars[bar]; parkedBar != nil { + // heap.Push(&s.bHeap, parkedBar) + // s.heapUpdated = true + // delete(s.parkedBars, bar) + // } + // if bar.toDrop { + // s.heapUpdated = true + // return + // } + // bar.priority = 0 + } }() cw.ReadFrom(<-bar.frameCh) lineCount += bar.extendedLines + 1 - } - - for i := len(s.barShutdownQueue) - 1; i >= 0; i-- { - s.barShutdownQueue[i]() - s.barShutdownQueue = s.barShutdownQueue[:i] - } + tmp[i] = bar + } + + for _, b := range tmp { + heap.Push(&s.bHeap, b) + } + + for _, b := range s.barShutdownQueue { + if parkedBar := s.parkedBars[b]; parkedBar != nil { + heap.Remove(&s.bHeap, b.index) + heap.Push(&s.bHeap, parkedBar) + delete(s.parkedBars, b) + s.heapUpdated = true + } else if b.toDrop { + heap.Remove(&s.bHeap, b.index) + s.heapUpdated = true + } + b.cancel() + } + s.barShutdownQueue = s.barShutdownQueue[0:0] return cw.Flush(lineCount) }