Browse code

pkg/ioutils: add NewBufReaderWithDrainbufAndBuffer

Docker-DCO-1.1-Signed-off-by: Cristian Staretu <cristian.staretu@gmail.com> (github: unclejack)

unclejack authored on 2014/08/20 01:58:07
Showing 1 changed files
... ...
@@ -24,16 +24,29 @@ func NewReadCloserWrapper(r io.Reader, closer func() error) io.ReadCloser {
24 24
 
25 25
 type bufReader struct {
26 26
 	sync.Mutex
27
-	buf    *bytes.Buffer
28
-	reader io.Reader
29
-	err    error
30
-	wait   sync.Cond
27
+	buf      *bytes.Buffer
28
+	reader   io.Reader
29
+	err      error
30
+	wait     sync.Cond
31
+	drainBuf []byte
31 32
 }
32 33
 
33 34
 func NewBufReader(r io.Reader) *bufReader {
34 35
 	reader := &bufReader{
35
-		buf:    &bytes.Buffer{},
36
-		reader: r,
36
+		buf:      &bytes.Buffer{},
37
+		drainBuf: make([]byte, 1024),
38
+		reader:   r,
39
+	}
40
+	reader.wait.L = &reader.Mutex
41
+	go reader.drain()
42
+	return reader
43
+}
44
+
45
+func NewBufReaderWithDrainbufAndBuffer(r io.Reader, drainBuffer []byte, buffer *bytes.Buffer) *bufReader {
46
+	reader := &bufReader{
47
+		buf:      buffer,
48
+		drainBuf: drainBuffer,
49
+		reader:   r,
37 50
 	}
38 51
 	reader.wait.L = &reader.Mutex
39 52
 	go reader.drain()
... ...
@@ -41,14 +54,13 @@ func NewBufReader(r io.Reader) *bufReader {
41 41
 }
42 42
 
43 43
 func (r *bufReader) drain() {
44
-	buf := make([]byte, 1024)
45 44
 	for {
46
-		n, err := r.reader.Read(buf)
45
+		n, err := r.reader.Read(r.drainBuf)
47 46
 		r.Lock()
48 47
 		if err != nil {
49 48
 			r.err = err
50 49
 		} else {
51
-			r.buf.Write(buf[0:n])
50
+			r.buf.Write(r.drainBuf[0:n])
52 51
 		}
53 52
 		r.wait.Signal()
54 53
 		r.Unlock()