File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -13,59 +13,65 @@ import (
1313)
1414
1515type Buffer struct {
16- data []byte
17- start int
18- end int
19- capacity int
20- refs atomic.Int32
21- managed bool
16+ data []byte
17+ start int
18+ end int
19+ capacity int
20+ refs atomic.Int32
21+ managed bool
22+ dataManaged bool
2223}
2324
2425func New () * Buffer {
25- return & Buffer {
26- data : Get (BufferSize ),
27- capacity : BufferSize ,
28- managed : true ,
29- }
26+ return NewSize (BufferSize )
3027}
3128
3229func NewPacket () * Buffer {
33- return & Buffer {
34- data : Get (UDPBufferSize ),
35- capacity : UDPBufferSize ,
36- managed : true ,
37- }
30+ return NewSize (UDPBufferSize )
3831}
3932
4033func NewSize (size int ) * Buffer {
34+ buffer := getBuffer ()
4135 if size == 0 {
42- return & Buffer {}
36+ * buffer = Buffer {
37+ managed : true ,
38+ }
4339 } else if size > 65535 {
44- return & Buffer {
40+ * buffer = Buffer {
4541 data : make ([]byte , size ),
4642 capacity : size ,
43+ managed : true ,
44+ }
45+ } else {
46+ * buffer = Buffer {
47+ data : Get (size ),
48+ capacity : size ,
49+ managed : true ,
50+ dataManaged : true ,
4751 }
4852 }
49- return & Buffer {
50- data : Get (size ),
51- capacity : size ,
52- managed : true ,
53- }
53+ return buffer
5454}
5555
5656func As (data []byte ) * Buffer {
57- return & Buffer {
57+ buffer := getBuffer ()
58+ * buffer = Buffer {
5859 data : data ,
5960 end : len (data ),
6061 capacity : len (data ),
62+ managed : true ,
6163 }
64+ return buffer
6265}
6366
6467func With (data []byte ) * Buffer {
65- return & Buffer {
68+ buffer := getBuffer ()
69+ * buffer = Buffer {
6670 data : data ,
6771 capacity : len (data ),
72+ managed : true ,
6873 }
74+ return buffer
6975}
7076
7177func (b * Buffer ) Byte (index int ) byte {
@@ -293,19 +299,28 @@ func (b *Buffer) DecRef() {
293299}
294300
295301func (b * Buffer ) Release () {
296- if b == nil || ! b .managed {
302+ if b == nil {
303+ return
304+ }
305+ managed , dataManaged := b .managed , b .dataManaged
306+ if ! (managed || dataManaged ) {
297307 return
298308 }
299309 if b .refs .Load () > 0 {
300310 return
301311 }
302- common .Must (Put (b .data ))
312+ if dataManaged {
313+ common .Must (Put (b .data ))
314+ }
303315 * b = Buffer {}
316+ if managed {
317+ putBuffer (b )
318+ }
304319}
305320
306321func (b * Buffer ) Leak () {
307322 if debug .Enabled {
308- if b == nil || ! b .managed {
323+ if b == nil || ! ( b .managed || b . dataManaged ) {
309324 return
310325 }
311326 refs := b .refs .Load ()
Original file line number Diff line number Diff line change 11package buf
22
3+ import "sync"
4+
35func Get (size int ) []byte {
46 if size == 0 {
57 return nil
@@ -11,6 +13,20 @@ func Put(buf []byte) error {
1113 return DefaultAllocator .Put (buf )
1214}
1315
16+ var bufferPool = sync.Pool {
17+ New : func () interface {} {
18+ return new (Buffer )
19+ },
20+ }
21+
22+ func getBuffer () * Buffer {
23+ return bufferPool .Get ().(* Buffer )
24+ }
25+
26+ func putBuffer (b * Buffer ) {
27+ bufferPool .Put (b )
28+ }
29+
1430// Deprecated: use array instead.
1531func Make (size int ) []byte {
1632 return make ([]byte , size )
You can’t perform that action at this time.
0 commit comments