recover if (*Bar).bytes panics
Vladimir Bauer
9 years ago
| 3 | 3 | "context" |
| 4 | 4 | "errors" |
| 5 | 5 | "io" |
| 6 | "log" | |
| 6 | 7 | "os" |
| 7 | 8 | "sort" |
| 8 | 9 | "sync" |
| 10 | 11 | |
| 11 | 12 | "github.com/vbauerster/mpb/cwriter" |
| 12 | 13 | ) |
| 14 | ||
| 15 | var logger = log.New(os.Stderr, "mpb: ", log.LstdFlags|log.Lshortfile) | |
| 13 | 16 | |
| 14 | 17 | // ErrCallAfterStop thrown by panic, if Progress methods like AddBar() are called |
| 15 | 18 | // after Stop() has been called |
| 181 | 184 | t.Stop() |
| 182 | 185 | close(p.done) |
| 183 | 186 | }() |
| 184 | const numDrawers = 4 | |
| 187 | const numDrawers = 3 | |
| 185 | 188 | bars := make([]*Bar, 0, 4) |
| 189 | var wg sync.WaitGroup | |
| 190 | recoverIfPanic := func() { | |
| 191 | if e := recover(); e != nil { | |
| 192 | logger.Printf("unexpected panic: %+v\n", e) | |
| 193 | } | |
| 194 | wg.Done() | |
| 195 | } | |
| 186 | 196 | for { |
| 187 | 197 | select { |
| 188 | 198 | case w := <-p.outChangeReqCh: |
| 221 | 231 | width, _ := cwriter.TerminalWidth() |
| 222 | 232 | ibars := iBarsGen(bars, width) |
| 223 | 233 | c := make(chan indexedBarBuffer) |
| 224 | var wg sync.WaitGroup | |
| 225 | 234 | wg.Add(numDrawers) |
| 226 | 235 | for i := 0; i < numDrawers; i++ { |
| 227 | 236 | go func() { |
| 237 | defer recoverIfPanic() | |
| 228 | 238 | drawer(ibars, c) |
| 229 | wg.Done() | |
| 230 | 239 | }() |
| 231 | 240 | } |
| 232 | 241 | go func() { |