handle err in (*Progress).serve
in case of error cancel all bars and shutdown
Vladimir Bauer
3 years ago
| 239 | 239 | func (p *Progress) serve(s *pState, cw *cwriter.Writer) { |
| 240 | 240 | defer p.cwg.Done() |
| 241 | 241 | |
| 242 | render := func(out io.Writer) { | |
| 243 | err := s.render(cw) | |
| 244 | for err != nil { | |
| 245 | if out != nil { | |
| 246 | _, err = fmt.Fprintln(out, err) | |
| 247 | } else { | |
| 248 | panic(err) | |
| 249 | } | |
| 250 | out = nil | |
| 251 | } | |
| 252 | } | |
| 253 | ||
| 254 | p.refreshCh = s.newTicker(p.done) | |
| 242 | refreshCh := s.newTicker(p.done) | |
| 255 | 243 | |
| 256 | 244 | for { |
| 257 | 245 | select { |
| 259 | 247 | op(s) |
| 260 | 248 | case fn := <-p.interceptIo: |
| 261 | 249 | fn(cw) |
| 262 | case <-p.refreshCh: | |
| 263 | render(s.debugOut) | |
| 250 | case <-refreshCh: | |
| 251 | err := s.render(cw) | |
| 252 | if err != nil { | |
| 253 | p.cancel() // cancel all bars | |
| 254 | p.once.Do(p.shutdown) | |
| 255 | s.heapUpdated = false | |
| 256 | refreshCh = nil | |
| 257 | _, _ = fmt.Fprintln(s.debugOut, err) | |
| 258 | } | |
| 264 | 259 | case <-s.shutdownNotifier: |
| 265 | 260 | for s.heapUpdated { |
| 266 | render(s.debugOut) | |
| 261 | err := s.render(cw) | |
| 262 | if err != nil { | |
| 263 | _, _ = fmt.Fprintln(s.debugOut, err) | |
| 264 | return | |
| 265 | } | |
| 267 | 266 | } |
| 268 | 267 | return |
| 269 | 268 | } |