@@ -30,9 +30,8 @@ type buffer struct {
30
30
}
31
31
32
32
func newBuffer (nc net.Conn ) buffer {
33
- var b [defaultBufSize ]byte
34
33
return buffer {
35
- buf : b [:] ,
34
+ buf : make ([] byte , defaultBufSize , defaultBufSize ) ,
36
35
nc : nc ,
37
36
}
38
37
}
@@ -51,7 +50,8 @@ func (b *buffer) fill(need int) error {
51
50
// Maybe keep the org buf slice and swap back?
52
51
if need > len (b .buf ) {
53
52
// Round up to the next multiple of the default size
54
- newBuf := make ([]byte , ((need / defaultBufSize )+ 1 )* defaultBufSize )
53
+ newSize := ((need / defaultBufSize ) + 1 ) * defaultBufSize
54
+ newBuf := make ([]byte , newSize , newSize )
55
55
copy (newBuf , b .buf )
56
56
b .buf = newBuf
57
57
}
@@ -114,13 +114,12 @@ func (b *buffer) takeBuffer(length int) []byte {
114
114
return nil
115
115
}
116
116
117
- // test (cheap) general case first
118
- if length <= defaultBufSize || length <= cap (b .buf ) {
117
+ if length <= len (b .buf ) {
119
118
return b .buf [:length ]
120
119
}
121
120
122
121
if length < maxPacketSize {
123
- b .buf = make ([]byte , length )
122
+ b .buf = make ([]byte , length , length )
124
123
return b .buf
125
124
}
126
125
return make ([]byte , length )
@@ -145,3 +144,12 @@ func (b *buffer) takeCompleteBuffer() []byte {
145
144
}
146
145
return b .buf
147
146
}
147
+
148
+ // setGrownBuffer set buf as internal buffer if cap(buf) is larger
149
+ // than len(b.buf). It can be used when you took buffer by
150
+ // takeCompleteBuffer and append some data to it.
151
+ func (b * buffer ) setGrownBuffer (buf []byte ) {
152
+ if cap (buf ) >= len (b .buf ) {
153
+ b .buf = buf [:cap (buf )]
154
+ }
155
+ }
0 commit comments