Browse Source

reduce memory consumption on readOne

Darien Raymond 7 years ago
parent
commit
844f6937a4
1 changed files with 11 additions and 0 deletions
  1. 11 0
      common/buf/reader.go

+ 11 - 0
common/buf/reader.go

@@ -8,7 +8,17 @@ import (
 )
 )
 
 
 func readOne(r io.Reader) (*Buffer, error) {
 func readOne(r io.Reader) (*Buffer, error) {
+	// Use an one-byte buffer to wait for incoming payload.
+	var firstByte [1]byte
+	nBytes, err := r.Read(firstByte[:])
+	if err != nil {
+		return nil, err
+	}
+
 	b := New()
 	b := New()
+	if nBytes > 0 {
+		copy(b.Extend(int32(nBytes)), firstByte[:])
+	}
 	for i := 0; i < 64; i++ {
 	for i := 0; i < 64; i++ {
 		_, err := b.ReadFrom(r)
 		_, err := b.ReadFrom(r)
 		if !b.IsEmpty() {
 		if !b.IsEmpty() {
@@ -20,6 +30,7 @@ func readOne(r io.Reader) (*Buffer, error) {
 		}
 		}
 	}
 	}
 
 
+	b.Release()
 	return nil, newError("Reader returns too many empty payloads.")
 	return nil, newError("Reader returns too many empty payloads.")
 }
 }