pkg/ioutils: add NewBufReaderWithDrainbufAndBuffer

Docker-DCO-1.1-Signed-off-by: Cristian Staretu <cristian.staretu@gmail.com> (github: unclejack)
This commit is contained in:
unclejack 2014-08-19 19:58:07 +03:00
parent 028b28e406
commit 65f57a95bb

View file

@ -28,11 +28,24 @@ type bufReader struct {
reader io.Reader reader io.Reader
err error err error
wait sync.Cond wait sync.Cond
drainBuf []byte
} }
func NewBufReader(r io.Reader) *bufReader { func NewBufReader(r io.Reader) *bufReader {
reader := &bufReader{ reader := &bufReader{
buf: &bytes.Buffer{}, 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: r,
} }
reader.wait.L = &reader.Mutex reader.wait.L = &reader.Mutex
@ -41,14 +54,13 @@ func NewBufReader(r io.Reader) *bufReader {
} }
func (r *bufReader) drain() { func (r *bufReader) drain() {
buf := make([]byte, 1024)
for { for {
n, err := r.reader.Read(buf) n, err := r.reader.Read(r.drainBuf)
r.Lock() r.Lock()
if err != nil { if err != nil {
r.err = err r.err = err
} else { } else {
r.buf.Write(buf[0:n]) r.buf.Write(r.drainBuf[0:n])
} }
r.wait.Signal() r.wait.Signal()
r.Unlock() r.Unlock()