mirror of
https://github.com/podman-container-tools/podman.git
synced 2026-09-10 17:47:52 +00:00
56 lines
1 KiB
Go
56 lines
1 KiB
Go
package mpb
|
|
|
|
import (
|
|
"errors"
|
|
"io"
|
|
"time"
|
|
)
|
|
|
|
// errInvalidWrite means that a write returned an impossible count.
|
|
var errInvalidWrite = errors.New("invalid write result")
|
|
|
|
// copyBuffer is a shameless copy paste of the same function from std lib's io.go with necessary
|
|
// changes to track ewma counters.
|
|
func copyBuffer(bar *Bar, dst io.Writer, src io.Reader, buf []byte) (written int64, err error) {
|
|
if buf == nil {
|
|
size := 32 * 1024
|
|
if l, ok := src.(*io.LimitedReader); ok && int64(size) > l.N {
|
|
if l.N < 1 {
|
|
size = 1
|
|
} else {
|
|
size = int(l.N)
|
|
}
|
|
}
|
|
buf = make([]byte, size)
|
|
}
|
|
for {
|
|
start := time.Now()
|
|
nr, er := src.Read(buf)
|
|
if nr > 0 {
|
|
nw, ew := dst.Write(buf[0:nr])
|
|
if nw < 0 || nr < nw {
|
|
nw = 0
|
|
if ew == nil {
|
|
ew = errInvalidWrite
|
|
}
|
|
}
|
|
written += int64(nw)
|
|
bar.EwmaIncrBy(nw, time.Since(start))
|
|
if ew != nil {
|
|
err = ew
|
|
break
|
|
}
|
|
if nr != nw {
|
|
err = io.ErrShortWrite
|
|
break
|
|
}
|
|
}
|
|
if er != nil {
|
|
if er != io.EOF {
|
|
err = er
|
|
}
|
|
break
|
|
}
|
|
}
|
|
return written, err
|
|
}
|