it's ok to return error immediately
b.frameCh is buffered
Vladimir Bauer
3 years ago
| 316 | 316 | return s.flush(cw, height) |
| 317 | 317 | } |
| 318 | 318 | |
| 319 | func (s *pState) flush(cw *cwriter.Writer, height int) (err error) { | |
| 319 | func (s *pState) flush(cw *cwriter.Writer, height int) error { | |
| 320 | 320 | var wg sync.WaitGroup |
| 321 | 321 | var popCount int |
| 322 | 322 | |
| 324 | 324 | b := heap.Pop(&s.bHeap).(*Bar) |
| 325 | 325 | frame := <-b.frameCh |
| 326 | 326 | if frame.err != nil { |
| 327 | if err == nil { | |
| 328 | err = frame.err | |
| 329 | } | |
| 330 | continue | |
| 327 | return frame.err | |
| 331 | 328 | } |
| 332 | 329 | var usedRows int |
| 333 | 330 | for i := len(frame.rows) - 1; i >= 0; i-- { |
| 367 | 364 | s.pool = append(s.pool, b) |
| 368 | 365 | } |
| 369 | 366 | |
| 370 | if err != nil { | |
| 371 | return err | |
| 372 | } | |
| 373 | ||
| 374 | 367 | wg.Add(1) |
| 375 | 368 | go func() { |
| 376 | 369 | for _, b := range s.pool { |
| 387 | 380 | } |
| 388 | 381 | } |
| 389 | 382 | |
| 390 | err = cw.Flush(len(s.rows) - popCount) | |
| 383 | err := cw.Flush(len(s.rows) - popCount) | |
| 391 | 384 | wg.Wait() |
| 392 | 385 | s.rows = s.rows[:0] |
| 393 | 386 | s.pool = s.pool[:0] |