address issue #136 again
instead blocking renderReq, discard any output until
delayRC fires.
Vladimir Bauer
2 years ago
| 261 | 261 | func (p *Progress) serve(s *pState, cw *cwriter.Writer) { |
| 262 | 262 | defer p.pwg.Done() |
| 263 | 263 | var err error |
| 264 | var renderReq <-chan time.Time | |
| 264 | w := cwriter.New(io.Discard) | |
| 265 | renderReq := s.renderReq | |
| 265 | 266 | |
| 266 | 267 | for { |
| 267 | 268 | select { |
| 268 | 269 | case op := <-p.operateState: |
| 269 | 270 | op(s) |
| 270 | 271 | case fn := <-p.interceptIO: |
| 271 | fn(cw) | |
| 272 | fn(w) | |
| 272 | 273 | case <-s.delayRC: |
| 273 | renderReq = s.renderReq | |
| 274 | w, cw = cw, nil | |
| 274 | 275 | s.delayRC = nil |
| 275 | 276 | case <-renderReq: |
| 276 | err = s.render(cw) | |
| 277 | err = s.render(w) | |
| 277 | 278 | if err != nil { |
| 278 | 279 | go func() { |
| 279 | 280 | for { |
| 292 | 293 | for s.autoRefresh && err == nil { |
| 293 | 294 | s.hm.state(update) |
| 294 | 295 | if <-update { |
| 295 | err = s.render(cw) | |
| 296 | err = s.render(w) | |
| 296 | 297 | } else { |
| 297 | 298 | break |
| 298 | 299 | } |