Codebase list golang-github-vbauerster-mpb / 57e3d84
manual revert a9bb9bb5 (reuse pool slice) culprit: https://github.com/vbauerster/mpb/blob/314158faaf7557a31a22ab69bd491799d46f2e3f/progress.go#L393 zero bars in stash pool doesn't mean zero bars on screen. address issue #122 Vladimir Bauer 3 years ago
1 changed file(s) with 14 addition(s) and 29 deletion(s). Raw diff Collapse all Expand all
3838 heapUpdated bool
3939 pMatrix map[int][]chan int
4040 aMatrix map[int][]chan int
41
42 // for reuse purposes
43 rows []io.Reader
44 pool []*Bar
4541
4642 // following are provided/overrided by user
4743 refreshRate time.Duration
7167 // method has been called.
7268 func NewWithContext(ctx context.Context, options ...ContainerOption) *Progress {
7369 s := &pState{
74 rows: make([]io.Reader, 0, 64),
75 pool: make([]*Bar, 0, 64),
7670 refreshRate: defaultRefreshRate,
7771 popPriority: math.MinInt32,
7872 manualRefresh: make(chan interface{}),
274268 defer close(p.shutdown)
275269
276270 render := func() error {
277 if s.bHeap.Len() == 0 {
278 return nil
279 }
280271 return s.render(cw)
281272 }
282273
335326
336327 func (s *pState) flush(wg *sync.WaitGroup, cw *cwriter.Writer, height int) error {
337328 var popCount int
329 rows := make([]io.Reader, 0, height)
330 pool := make([]*Bar, 0, s.bHeap.Len())
338331
339332 for s.bHeap.Len() > 0 {
340333 b := heap.Pop(&s.bHeap).(*Bar)
345338 }
346339 var usedRows int
347340 for i := len(frame.rows) - 1; i >= 0; i-- {
348 if row := frame.rows[i]; len(s.rows) < height {
349 s.rows = append(s.rows, row)
341 if row := frame.rows[i]; len(rows) < height {
342 rows = append(rows, row)
350343 usedRows++
351344 } else {
352345 wg.Add(1)
361354 if qb, ok := s.queueBars[b]; ok {
362355 delete(s.queueBars, b)
363356 qb.priority = b.priority
364 s.pool = append(s.pool, qb)
357 pool = append(pool, qb)
365358 s.heapUpdated = true
366359 continue
367360 }
382375 continue
383376 }
384377 }
385 s.pool = append(s.pool, b)
386 }
387
388 switch len(s.pool) {
389 case 0:
390 if s.heapUpdated {
391 s.updateSyncMatrix()
392 s.heapUpdated = false
393 }
378 pool = append(pool, b)
379 }
380
381 switch len(pool) {
394382 case 1:
395 heap.Push(&s.bHeap, s.pool[0])
396 s.pool = s.pool[:0]
383 heap.Push(&s.bHeap, pool[0])
397384 default:
398385 wg.Add(1)
399386 go func() {
400 for _, b := range s.pool {
387 for _, b := range pool {
401388 heap.Push(&s.bHeap, b)
402389 }
403 s.pool = s.pool[:0]
404390 wg.Done()
405391 }()
406392 }
407393
408 for i := len(s.rows) - 1; i >= 0; i-- {
409 _, err := cw.ReadFrom(s.rows[i])
394 for i := len(rows) - 1; i >= 0; i-- {
395 _, err := cw.ReadFrom(rows[i])
410396 if err != nil {
411397 return err
412398 }
413399 }
414400
415 err := cw.Flush(len(s.rows) - popCount)
416 s.rows = s.rows[:0]
401 err := cw.Flush(len(rows) - popCount)
417402 return err
418403 }
419404