Browse Source

pkg/ioutils: add NewBufReaderWithDrainbufAndBuffer

Docker-DCO-1.1-Signed-off-by: Cristian Staretu <cristian.staretu@gmail.com> (github: unclejack)
unclejack 11 years ago
parent
commit
c93b9e81c0
1 changed files with 21 additions and 9 deletions
  1. 21 9
      pkg/ioutils/readers.go

+ 21 - 9
pkg/ioutils/readers.go

@@ -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()