Skip to content

Commit 0dd22b3

Browse files
committed
Add simple buffer struct pool
1 parent bf06c45 commit 0dd22b3

2 files changed

Lines changed: 59 additions & 28 deletions

File tree

common/buf/buffer.go

Lines changed: 43 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -13,59 +13,65 @@ import (
1313
)
1414

1515
type 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

2425
func New() *Buffer {
25-
return &Buffer{
26-
data: Get(BufferSize),
27-
capacity: BufferSize,
28-
managed: true,
29-
}
26+
return NewSize(BufferSize)
3027
}
3128

3229
func NewPacket() *Buffer {
33-
return &Buffer{
34-
data: Get(UDPBufferSize),
35-
capacity: UDPBufferSize,
36-
managed: true,
37-
}
30+
return NewSize(UDPBufferSize)
3831
}
3932

4033
func 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

5656
func 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

6467
func 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

7177
func (b *Buffer) Byte(index int) byte {
@@ -293,19 +299,28 @@ func (b *Buffer) DecRef() {
293299
}
294300

295301
func (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

306321
func (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()

common/buf/pool.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package buf
22

3+
import "sync"
4+
35
func 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.
1531
func Make(size int) []byte {
1632
return make([]byte, size)

0 commit comments

Comments
 (0)