Codebase list golang-github-vbauerster-mpb / 8b54082
make sure b.cancel is called after OnComplete decorators Vladimir Bauer 3 years ago
2 changed file(s) with 24 addition(s) and 17 deletion(s). Raw diff Collapse all Expand all
5555 }
5656
5757 type renderFrame struct {
58 rows []io.Reader
59 shutdown bool
60 err error
58 rows []io.Reader
59 shutdown int
60 rmOnComplete bool
61 noPop bool
62 err error
6163 }
6264
6365 func newBar(ctx context.Context, container *Progress, bs *bState) *Bar {
410412 }
411413
412414 func (b *Bar) render(tw int) {
413 var done bool
414415 fn := func(s *bState) {
415416 var rows []io.Reader
416417 stat := newStatistics(tw, s)
427428 return
428429 }
429430 }
430 frame := &renderFrame{rows: rows}
431 frame := &renderFrame{
432 rows: rows,
433 shutdown: s.shutdown,
434 rmOnComplete: s.dropOnComplete,
435 noPop: s.noPop,
436 }
431437 if s.completed || s.aborted {
432 frame.shutdown = !done || s.shutdown == 1
433 b.cancel()
438 // post increment makes sure OnComplete decorators are rendered
439 s.shutdown++
434440 }
435441 b.frameCh <- frame
436442 }
437443 select {
438444 case b.operateState <- fn:
439445 case <-b.done:
440 done = true
441446 fn(b.bs)
442447 }
443448 }
333333 _, _ = io.Copy(io.Discard, row)
334334 }
335335 }
336 if frame.shutdown {
337 b.Wait() // waiting for b.done, so it's safe to read b.bs
336 if frame.shutdown != 0 {
338337 if qb, ok := s.queueBars[b]; ok {
338 b.cancel()
339339 delete(s.queueBars, b)
340340 qb.priority = b.priority
341341 wg.Add(1)
345345 }(qb)
346346 continue
347347 }
348 if s.popCompleted && !b.bs.noPop {
349 switch b.bs.shutdown++; b.bs.shutdown {
348 if s.popCompleted && !frame.noPop {
349 switch frame.shutdown {
350350 case 1:
351351 b.priority = s.popPriority
352352 s.popPriority++
353353 default:
354 if b.bs.dropOnComplete {
355 popCount += usedRows
356 continue
357 }
354 b.cancel()
355 popCount += usedRows
356 continue
358357 }
359 } else if b.bs.dropOnComplete {
358 } else if frame.rmOnComplete {
359 b.cancel()
360360 continue
361 } else {
362 b.cancel()
361363 }
362364 }
363365 wg.Add(1)