case bar.done
Vladimir Bauer
7 years ago
| 197 | 197 | } |
| 198 | 198 | return |
| 199 | 199 | } |
| 200 | if err := s.render(p.done, cw); err != nil { | |
| 200 | if err := s.render(cw); err != nil { | |
| 201 | 201 | fmt.Fprintf(s.debugOut, "[mpb] %s %v\n", time.Now(), err) |
| 202 | 202 | } |
| 203 | 203 | } |
| 204 | 204 | } |
| 205 | 205 | } |
| 206 | 206 | |
| 207 | func (s *pState) render(done <-chan struct{}, cw *cwriter.Writer) error { | |
| 207 | func (s *pState) render(cw *cwriter.Writer) error { | |
| 208 | 208 | if s.heapUpdated { |
| 209 | 209 | s.updateSyncMatrix() |
| 210 | 210 | s.heapUpdated = false |
| 221 | 221 | go bar.render(s.debugOut, tw) |
| 222 | 222 | } |
| 223 | 223 | |
| 224 | return s.flush(done, cw) | |
| 225 | } | |
| 226 | ||
| 227 | func (s *pState) flush(done <-chan struct{}, cw *cwriter.Writer) error { | |
| 224 | return s.flush(cw) | |
| 225 | } | |
| 226 | ||
| 227 | func (s *pState) flush(cw *cwriter.Writer) error { | |
| 228 | 228 | var lineCount int |
| 229 | 229 | for s.bHeap.Len() > 0 { |
| 230 | 230 | bar := heap.Pop(s.bHeap).(*Bar) |
| 231 | 231 | frame := <-bar.bFrameCh |
| 232 | 232 | defer func() { |
| 233 | 233 | if frame.toShutdown { |
| 234 | // force next refresh asap, without waiting for ticker | |
| 235 | 234 | go func() { |
| 235 | // force next refresh, so it will be triggered either by ticker or by | |
| 236 | // this goroutine, whichever comes first | |
| 236 | 237 | select { |
| 237 | 238 | case s.forceRefreshCh <- time.Now(): |
| 238 | case <-done: | |
| 239 | return | |
| 239 | case <-bar.done: | |
| 240 | 240 | } |
| 241 | 241 | }() |
| 242 | 242 | // shutdown at next flush, in other words decrement underlying WaitGroup |