put bar serve method back
Vladimir Bauer
4 years ago
| 68 | 68 |
complete bool
|
| 69 | 69 |
}
|
| 70 | 70 |
|
| 71 | |
func newBar(container *Progress, bs *bState) (*Bar, func()) {
|
|
71 |
func newBar(container *Progress, bs *bState) *Bar {
|
| 72 | 72 |
ctx, cancel := context.WithCancel(container.ctx)
|
| 73 | |
operateState := make(chan func(*bState))
|
| 74 | |
done := make(chan struct{})
|
| 75 | |
serve := func() {
|
| 76 | |
defer container.bwg.Done()
|
| 77 | |
for {
|
| 78 | |
select {
|
| 79 | |
case op := <-operateState:
|
| 80 | |
op(bs)
|
| 81 | |
case <-ctx.Done():
|
| 82 | |
bs.aborted = !bs.completed
|
| 83 | |
bs.decoratorShutdownNotify()
|
| 84 | |
close(done)
|
| 85 | |
return
|
| 86 | |
}
|
| 87 | |
}
|
| 88 | |
}
|
| 89 | 73 |
|
| 90 | 74 |
bar := &Bar{
|
| 91 | 75 |
priority: bs.priority,
|
| 92 | 76 |
hasEwma: len(bs.ewmaDecorators) != 0,
|
| 93 | 77 |
frameCh: make(chan *frame, 1),
|
| 94 | |
operateState: operateState,
|
| 95 | |
done: done,
|
|
78 |
operateState: make(chan func(*bState)),
|
|
79 |
done: make(chan struct{}),
|
| 96 | 80 |
container: container,
|
| 97 | |
bs: bs,
|
| 98 | 81 |
cancel: cancel,
|
| 99 | 82 |
}
|
| 100 | 83 |
|
| 101 | |
return bar, serve
|
|
84 |
go bar.serve(ctx, bs)
|
|
85 |
return bar
|
| 102 | 86 |
}
|
| 103 | 87 |
|
| 104 | 88 |
// ProxyReader wraps r with metrics required for progress tracking.
|
|
| 310 | 294 |
return <-result
|
| 311 | 295 |
case <-b.done:
|
| 312 | 296 |
return b.bs.completed
|
|
297 |
}
|
|
298 |
}
|
|
299 |
|
|
300 |
func (b *Bar) serve(ctx context.Context, bs *bState) {
|
|
301 |
defer b.container.bwg.Done()
|
|
302 |
for {
|
|
303 |
select {
|
|
304 |
case op := <-b.operateState:
|
|
305 |
op(bs)
|
|
306 |
case <-ctx.Done():
|
|
307 |
bs.aborted = !bs.completed
|
|
308 |
bs.decoratorShutdownNotify()
|
|
309 |
b.bs = bs
|
|
310 |
close(b.done)
|
|
311 |
return
|
|
312 |
}
|
| 313 | 313 |
}
|
| 314 | 314 |
}
|
| 315 | 315 |
|
| 48 | 48 |
externalRefresh <-chan interface{}
|
| 49 | 49 |
renderDelay <-chan struct{}
|
| 50 | 50 |
shutdownNotifier chan struct{}
|
| 51 | |
queueBars map[*Bar]queueBar
|
|
51 |
queueBars map[*Bar]*Bar
|
| 52 | 52 |
output io.Writer
|
| 53 | 53 |
debugOut io.Writer
|
| 54 | |
}
|
| 55 | |
|
| 56 | |
type queueBar struct {
|
| 57 | |
bar *Bar
|
| 58 | |
serve func()
|
| 59 | 54 |
}
|
| 60 | 55 |
|
| 61 | 56 |
// New creates new Progress container instance. It's not possible to
|
|
| 71 | 66 |
s := &pState{
|
| 72 | 67 |
bHeap: priorityQueue{},
|
| 73 | 68 |
rr: prr,
|
| 74 | |
queueBars: make(map[*Bar]queueBar),
|
|
69 |
queueBars: make(map[*Bar]*Bar),
|
| 75 | 70 |
output: os.Stdout,
|
| 76 | 71 |
}
|
| 77 | 72 |
|
|
| 122 | 117 |
select {
|
| 123 | 118 |
case p.operateState <- func(ps *pState) {
|
| 124 | 119 |
bs := ps.makeBarState(total, filler, options...)
|
| 125 | |
bar, serve := newBar(p, bs)
|
|
120 |
bar := newBar(p, bs)
|
| 126 | 121 |
if bs.afterBar != nil {
|
| 127 | |
ps.queueBars[bs.afterBar] = queueBar{bar, serve}
|
|
122 |
ps.queueBars[bs.afterBar] = bar
|
| 128 | 123 |
} else {
|
| 129 | 124 |
heap.Push(&ps.bHeap, bar)
|
| 130 | 125 |
ps.heapUpdated = true
|
| 131 | |
go serve()
|
| 132 | 126 |
}
|
| 133 | 127 |
ps.idCount++
|
| 134 | 128 |
result <- bar
|
|
| 292 | 286 |
var toDrop bool
|
| 293 | 287 |
if qb, ok := s.queueBars[b]; ok {
|
| 294 | 288 |
delete(s.queueBars, b)
|
| 295 | |
qb.bar.priority = b.priority
|
| 296 | |
heap.Push(&s.bHeap, qb.bar)
|
| 297 | |
go qb.serve()
|
|
289 |
qb.priority = b.priority
|
|
290 |
heap.Push(&s.bHeap, qb)
|
| 298 | 291 |
toDrop = true
|
| 299 | 292 |
} else if s.popCompleted && !b.bs.noPop {
|
| 300 | 293 |
frame := bm[b]
|