check hm.state after p.done
Vladimir Bauer
3 years ago
| 246 | 246 | } |
| 247 | 247 | |
| 248 | 248 | func (p *Progress) serve(s *pState, cw *cwriter.Writer) { |
| 249 | var err error | |
| 249 | 250 | render := func() error { |
| 250 | 251 | return s.render(cw) |
| 251 | 252 | } |
| 261 | 262 | case fn := <-p.interceptIo: |
| 262 | 263 | fn(cw) |
| 263 | 264 | case <-refreshCh: |
| 264 | err := render() | |
| 265 | e := render() | |
| 266 | if e != nil { | |
| 267 | p.cancel() // cancel all bars | |
| 268 | render = func() error { return nil } | |
| 269 | err = e | |
| 270 | } | |
| 271 | case <-p.done: | |
| 272 | ch := make(chan bool) | |
| 273 | for err == nil { | |
| 274 | s.hm.state(ch) | |
| 275 | isUnrenderedState := <-ch | |
| 276 | if isUnrenderedState { | |
| 277 | err = render() | |
| 278 | } else { | |
| 279 | break | |
| 280 | } | |
| 281 | } | |
| 265 | 282 | if err != nil { |
| 266 | 283 | _, _ = fmt.Fprintln(s.debugOut, err.Error()) |
| 267 | render = func() error { return nil } | |
| 268 | p.cancel() // cancel all bars | |
| 269 | } | |
| 270 | case <-p.done: | |
| 284 | } | |
| 271 | 285 | s.hm.end(s.shutdownNotifier) |
| 272 | 286 | close(p.shutdown) |
| 273 | 287 | return |