| 48 | 48 |
popCompleted bool
|
| 49 | 49 |
rr time.Duration
|
| 50 | 50 |
uwg *sync.WaitGroup
|
| 51 | |
manualRefreshCh <-chan time.Time
|
|
51 |
manualRefresh <-chan time.Time
|
|
52 |
renderDelay <-chan struct{}
|
| 52 | 53 |
shutdownNotifier chan struct{}
|
| 53 | 54 |
parkedBars map[*Bar]*Bar
|
| 54 | 55 |
output io.Writer
|
|
| 207 | 208 |
manualOrTickCh, cleanUp := s.manualOrTick()
|
| 208 | 209 |
defer cleanUp()
|
| 209 | 210 |
|
| 210 | |
refreshCh := fanInRefreshSrc(p.done, p.forceRefresh, manualOrTickCh)
|
|
211 |
refreshCh := fanInRefreshSrc(p.done, s.renderDelay, p.forceRefresh, manualOrTickCh)
|
| 211 | 212 |
|
| 212 | 213 |
for {
|
| 213 | 214 |
select {
|
|
| 303 | 304 |
}
|
| 304 | 305 |
|
| 305 | 306 |
func (s *pState) manualOrTick() (<-chan time.Time, func()) {
|
| 306 | |
if s.manualRefreshCh != nil {
|
| 307 | |
return s.manualRefreshCh, func() {}
|
|
307 |
if s.manualRefresh != nil {
|
|
308 |
return s.manualRefresh, func() {}
|
| 308 | 309 |
}
|
| 309 | 310 |
ticker := time.NewTicker(s.rr)
|
| 310 | 311 |
return ticker.C, ticker.Stop
|
|
| 372 | 373 |
}
|
| 373 | 374 |
}
|
| 374 | 375 |
|
| 375 | |
func fanInRefreshSrc(done <-chan struct{}, channels ...<-chan time.Time) <-chan time.Time {
|
|
376 |
func fanInRefreshSrc(done, delay <-chan struct{}, channels ...<-chan time.Time) <-chan time.Time {
|
| 376 | 377 |
var wg sync.WaitGroup
|
| 377 | 378 |
multiplexedStream := make(chan time.Time)
|
|
379 |
start := make(chan struct{})
|
| 378 | 380 |
|
| 379 | 381 |
multiplex := func(c <-chan time.Time) {
|
| 380 | 382 |
defer wg.Done()
|
|
383 |
<-start
|
| 381 | 384 |
// source channels are never closed (time.Ticker never closes associated
|
| 382 | 385 |
// channel), so we cannot simply range over a c, instead we use select
|
| 383 | 386 |
// inside infinite loop
|
|
| 395 | 398 |
}
|
| 396 | 399 |
}
|
| 397 | 400 |
|
|
401 |
if delay != nil {
|
|
402 |
go func() {
|
|
403 |
<-delay
|
|
404 |
close(start)
|
|
405 |
}()
|
|
406 |
} else {
|
|
407 |
close(start)
|
|
408 |
}
|
|
409 |
|
| 398 | 410 |
wg.Add(len(channels))
|
| 399 | 411 |
for _, c := range channels {
|
| 400 | 412 |
go multiplex(c)
|