Codebase list golang-github-vbauerster-mpb / 5e2ae42
proxyReader: don't SetTotal inside Read Vladimir Bauer 4 years ago
2 changed file(s) with 10 addition(s) and 8 deletion(s). Raw diff Collapse all Expand all
8484 }
8585
8686 // ProxyReader wraps r with metrics required for progress tracking.
87 // Panics if r is nil.
87 // If r is 'unknown total/size' reader it's mandatory to call
88 // (*Bar).SetTotal(-1, true) method after (Reader).Read returns io.EOF.
89 // Panics if r is nil. If bar is already completed or aborted, returns
90 // nil.
8891 func (b *Bar) ProxyReader(r io.Reader) io.ReadCloser {
8992 if r == nil {
9093 panic("expected non nil io.Reader")
9194 }
92 return b.newProxyReader(r)
95 select {
96 case <-b.done:
97 return nil
98 default:
99 return b.newProxyReader(r)
100 }
93101 }
94102
95103 // ID returs id of the bar.
1313 func (x proxyReader) Read(p []byte) (int, error) {
1414 n, err := x.ReadCloser.Read(p)
1515 x.bar.IncrBy(n)
16 if err == io.EOF {
17 go x.bar.SetTotal(-1, true)
18 }
1916 return n, err
2017 }
2118
2724 func (x proxyWriterTo) WriteTo(w io.Writer) (int64, error) {
2825 n, err := x.wt.WriteTo(w)
2926 x.bar.IncrInt64(n)
30 if err == io.EOF {
31 go x.bar.SetTotal(-1, true)
32 }
3327 return n, err
3428 }
3529