Codebase list golang-github-vbauerster-mpb / ad7eb2b
pass lineCount Vladimir Bauer 7 years ago
3 changed file(s) with 33 addition(s) and 27 deletion(s). Raw diff Collapse all Expand all
3737 boolCh chan bool
3838 frameReaderCh chan *frameReader
3939 syncTableCh chan [][]chan int
40 bufNL *bytes.Buffer
4140
4241 // done is closed by Bar's goroutine, after cacheState is written
4342 done chan struct{}
6463 shutdownListeners []decor.ShutdownListener
6564 refill *refill
6665 bufP, bufB, bufA *bytes.Buffer
66 bufNL *bytes.Buffer
6767 panicMsg string
6868 newLineExtendFn func(io.Writer, *decor.Statistics)
6969
7777 }
7878 frameReader struct {
7979 io.Reader
80 extendedLines int
8081 toShutdown bool
8182 removeOnComplete bool
8283 }
120121 }
121122
122123 if s.newLineExtendFn != nil {
123 b.bufNL = bytes.NewBuffer(make([]byte, 0, s.width))
124 s.bufNL = bytes.NewBuffer(make([]byte, 0, s.width))
124125 }
125126
126127 go b.serve(wg, s, cancel)
282283 }
283284 }()
284285 r := s.draw(tw)
286 var extendedLines int
285287 if s.newLineExtendFn != nil {
286 b.bufNL.Reset()
287 s.newLineExtendFn(b.bufNL, newStatistics(s))
288 r = io.MultiReader(r, b.bufNL)
288 s.bufNL.Reset()
289 s.newLineExtendFn(s.bufNL, newStatistics(s))
290 extendedLines = countLines(s.bufNL.Bytes())
291 r = io.MultiReader(r, s.bufNL)
289292 }
290293 b.frameReaderCh <- &frameReader{
291294 Reader: r,
295 extendedLines: extendedLines,
292296 toShutdown: s.toComplete && !s.completeFlushed,
293297 removeOnComplete: s.removeOnComplete,
294298 }
297301 case <-b.done:
298302 s := b.cacheState
299303 r := s.draw(tw)
304 var extendedLines int
300305 if s.newLineExtendFn != nil {
301 b.bufNL.Reset()
302 s.newLineExtendFn(b.bufNL, newStatistics(s))
303 r = io.MultiReader(r, b.bufNL)
304 }
305 b.frameReaderCh <- &frameReader{Reader: r}
306 s.bufNL.Reset()
307 s.newLineExtendFn(s.bufNL, newStatistics(s))
308 extendedLines = countLines(s.bufNL.Bytes())
309 r = io.MultiReader(r, s.bufNL)
310 }
311 b.frameReaderCh <- &frameReader{
312 Reader: r,
313 extendedLines: extendedLines,
314 }
306315 }
307316 }
308317
434443 }
435444 return
436445 }
446
447 func countLines(b []byte) int {
448 return bytes.Count(b, []byte("\n"))
449 }
2626 type Writer struct {
2727 out io.Writer
2828 buf bytes.Buffer
29 lineSep []byte
3029 lineCount int
3130 }
3231
3332 // New returns a new Writer with defaults
3433 func New(w io.Writer) *Writer {
35 return &Writer{
36 out: w,
37 lineSep: []byte("\n"),
38 }
34 return &Writer{out: w}
3935 }
4036
4137 // Flush flushes the underlying buffer
42 func (w *Writer) Flush() error {
38 func (w *Writer) Flush(lineCount int) error {
4339 err := w.clearLines()
44 w.lineCount = bytes.Count(w.buf.Bytes(), w.lineSep)
40 w.lineCount = lineCount
4541 // WriteTo takes care of w.buf.Reset
4642 if _, e := w.buf.WriteTo(w.out); err == nil {
4743 err = e
192192 go bar.render(s.debugOut, tw)
193193 }
194194
195 if err := s.flush(); err != nil {
195 if err := s.flush(s.bHeap.Len()); err != nil {
196196 fmt.Fprintf(s.debugOut, "%s %s %v\n", "[mpb]", time.Now(), err)
197197 }
198198 }
199199
200 func (s *pState) flush() (err error) {
200 func (s *pState) flush(lineCount int) (err error) {
201201 for s.bHeap.Len() > 0 {
202202 bar := heap.Pop(s.bHeap).(*Bar)
203203 frameReader := <-bar.frameReaderCh
204 if _, e := s.cw.ReadFrom(frameReader); e != nil {
205 err = e
206 }
207204 defer func() {
208205 if frameReader.toShutdown {
209206 // shutdown at next flush, in other words decrement underlying WaitGroup
222219 }
223220 heap.Push(s.bHeap, bar)
224221 }()
225 }
226
227 if e := s.cw.Flush(); err == nil {
228 err = e
229 }
222 _, err = s.cw.ReadFrom(frameReader)
223 lineCount += frameReader.extendedLines
224 }
225
226 err = s.cw.Flush(lineCount)
230227
231228 for i := len(s.shutdownPending) - 1; i >= 0; i-- {
232229 close(s.shutdownPending[i].shutdown)