pkg/ioutils: add NewBufReaderWithDrainbufAndBuffer

Docker-DCO-1.1-Signed-off-by: Cristian Staretu <cristian.staretu@gmail.com> (github: unclejack)
Upstream-commit: c93b9e81c03168ca69def94ba231d2ecc6672ce9
Component: engine
This commit is contained in:
unclejack
2014-09-03 11:36:21 +03:00
parent 0e15abc25d
commit dca3941db1
+21 -9
View File
@@ -24,16 +24,29 @@ func NewReadCloserWrapper(r io.Reader, closer func() error) io.ReadCloser {
type bufReader struct {
sync.Mutex
buf *bytes.Buffer
reader io.Reader
err error
wait sync.Cond
buf *bytes.Buffer
reader io.Reader
err error
wait sync.Cond
drainBuf []byte
}
func NewBufReader(r io.Reader) *bufReader {
reader := &bufReader{
buf: &bytes.Buffer{},
reader: r,
buf: &bytes.Buffer{},
drainBuf: make([]byte, 1024),
reader: r,
}
reader.wait.L = &reader.Mutex
go reader.drain()
return reader
}
func NewBufReaderWithDrainbufAndBuffer(r io.Reader, drainBuffer []byte, buffer *bytes.Buffer) *bufReader {
reader := &bufReader{
buf: buffer,
drainBuf: drainBuffer,
reader: r,
}
reader.wait.L = &reader.Mutex
go reader.drain()
@@ -41,14 +54,13 @@ func NewBufReader(r io.Reader) *bufReader {
}
func (r *bufReader) drain() {
buf := make([]byte, 1024)
for {
n, err := r.reader.Read(buf)
n, err := r.reader.Read(r.drainBuf)
r.Lock()
if err != nil {
r.err = err
} else {
r.buf.Write(buf[0:n])
r.buf.Write(r.drainBuf[0:n])
}
r.wait.Signal()
r.Unlock()