Codebase list golang-github-vbauerster-mpb / a094746
proxyReader: manual trigger complete only if total is unknown Vladimir Bauer 4 years ago
2 changed file(s) with 14 addition(s) and 6 deletion(s). Raw diff Collapse all Expand all
8989 if r == nil {
9090 panic("expected non nil io.Reader")
9191 }
92 return b.newProxyReader(r)
92 result := make(chan bool)
93 select {
94 case b.operateState <- func(s *bState) { result <- s.triggerComplete }:
95 triggerComplete := <-result
96 return b.newProxyReader(r, !triggerComplete)
97 case <-b.done:
98 return nil
99 }
93100 }
94101
95102 // ID returs id of the bar.
77
88 type proxyReader struct {
99 io.ReadCloser
10 bar *Bar
10 bar *Bar
11 totalUnknown bool
1112 }
1213
1314 func (x proxyReader) Read(p []byte) (int, error) {
1415 n, err := x.ReadCloser.Read(p)
1516 x.bar.IncrBy(n)
16 if err == io.EOF {
17 if x.totalUnknown && err == io.EOF {
1718 go x.bar.SetTotal(-1, true)
1819 }
1920 return n, err
2728 func (x proxyWriterTo) WriteTo(w io.Writer) (int64, error) {
2829 n, err := x.wt.WriteTo(w)
2930 x.bar.IncrInt64(n)
30 if err == io.EOF {
31 if x.totalUnknown && err == io.EOF {
3132 go x.bar.SetTotal(-1, true)
3233 }
3334 return n, err
6061 return n, err
6162 }
6263
63 func (b *Bar) newProxyReader(r io.Reader) (rc io.ReadCloser) {
64 pr := proxyReader{toReadCloser(r), b}
64 func (b *Bar) newProxyReader(r io.Reader, totalUnknown bool) (rc io.ReadCloser) {
65 pr := proxyReader{toReadCloser(r), b, totalUnknown}
6566 if wt, ok := r.(io.WriterTo); ok {
6667 pw := proxyWriterTo{pr, wt}
6768 if b.hasEwma {