summaryrefslogtreecommitdiff
path: root/vendor/github.com/vbauerster/mpb/v7/bar.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/vbauerster/mpb/v7/bar.go')
-rw-r--r--vendor/github.com/vbauerster/mpb/v7/bar.go25
1 files changed, 14 insertions, 11 deletions
diff --git a/vendor/github.com/vbauerster/mpb/v7/bar.go b/vendor/github.com/vbauerster/mpb/v7/bar.go
index 22f608317..dabe1a475 100644
--- a/vendor/github.com/vbauerster/mpb/v7/bar.go
+++ b/vendor/github.com/vbauerster/mpb/v7/bar.go
@@ -268,15 +268,19 @@ func (b *Bar) SetPriority(priority int) {
// if bar is already in complete state. If drop is true bar will be
// removed as well.
func (b *Bar) Abort(drop bool) {
+ done := make(chan struct{})
select {
case b.operateState <- func(s *bState) {
if s.completed == true {
+ close(done)
return
}
- if drop {
- go b.container.dropBar(b)
- } else {
- go func() {
+ // container must be run during lifetime of this inner goroutine
+ // we control this by done channel declared above
+ go func() {
+ if drop {
+ b.container.dropBar(b)
+ } else {
var uncompleted int
b.container.traverseBars(func(bar *Bar) bool {
if b != bar && !bar.Completed() {
@@ -286,16 +290,15 @@ func (b *Bar) Abort(drop bool) {
return true
})
if uncompleted == 0 {
- select {
- case b.container.refreshCh <- time.Now():
- case <-b.container.done:
- }
+ b.container.refreshCh <- time.Now()
}
- }()
- }
+ }
+ close(done) // release hold of Abort
+ }()
b.cancel()
}:
- <-b.done
+ // guarantee: container is alive during lifetime of this hold
+ <-done
case <-b.done:
}
}