Browse Source

return buffers to pool in Writer.ReadFrom

Pierre.Curto 5 years ago
parent
commit
29eb66c921
1 changed files with 10 additions and 1 deletions
  1. 10 1
      writer.go

+ 10 - 1
writer.go

@@ -214,8 +214,12 @@ func (w *Writer) ReadFrom(r io.Reader) (n int64, err error) {
 	size := w.frame.Descriptor.Flags.BlockSizeIndex()
 	var done bool
 	var rn int
+	data := size.Get()
+	if w.isNotConcurrent() {
+		// Keep the same buffer for the whole process.
+		defer size.Put(data)
+	}
 	for !done {
-		data := size.Get()
 		rn, err = io.ReadFull(r, data)
 		switch err {
 		case nil:
@@ -230,6 +234,11 @@ func (w *Writer) ReadFrom(r io.Reader) (n int64, err error) {
 			return
 		}
 		w.handler(rn)
+		if !done && !w.isNotConcurrent() {
+			// The buffer will be returned automatically by go routines (safe=true)
+			// so get a new one fo the next round.
+			data = size.Get()
+		}
 	}
 	err = w.Close()
 	return