@@ -36,52 +36,58 @@ func TestBuffer(t *testing.T) {
3636 assert .Equal (t , uint32 (1024 ), b .Capacity ())
3737}
3838
39- func TestSynchronizedBufferPool_Clone_returnsNewlyAllocatedBuffer (t * testing.T ) {
39+ func TestSynchronizedBufferPool_Get_returnsNilWhenEmpty (t * testing.T ) {
4040 pool := newBufferPool (& sync.Pool {})
41+ assert .Nil (t , pool .Get ())
42+ }
4143
42- buffer := NewBuffer (1024 )
43- buffer .Write ([]byte {1 , 2 , 3 })
44+ func TestSynchronizedBufferPool_Put_marksBufferAsNotSharedAnymore (t * testing.T ) {
45+ buffer := NewSharedBuffer (NewBuffer (1024 )).Retain ()
46+ assert .True (t , buffer .isCurrentlyShared .Load ())
4447
45- res := pool .Clone (buffer )
46- assert .Equal (t , []byte {1 , 2 , 3 }, res .ReadableSlice ())
48+ pool := newBufferPool (& sync.Pool {})
49+ pool .Put (buffer )
50+ assert .False (t , buffer .isCurrentlyShared .Load ())
4751}
4852
49- func TestSynchronizedBufferPool_Clone_returnsRecycledBuffer (t * testing.T ) {
53+ func TestSynchronizedBufferPool_Put_recyclesSharedBuffer (t * testing.T ) {
5054 pool := newBufferPool (& sync.Pool {})
5155
5256 for range 100 {
53- buffer := NewBuffer (1024 )
54- buffer . Write ([] byte { 1 , 2 , 3 } )
57+ buffer := NewSharedBuffer ( NewBuffer (1024 )). Retain ( )
58+ pool . Put ( buffer )
5559 pool .Put (buffer )
56- }
5760
58- buffer := NewBuffer (1024 )
59- buffer .Write ([]byte {1 , 2 , 3 })
61+ if res := pool .Get (); res != nil {
62+ return
63+ }
64+ }
6065
61- res := pool .Clone (buffer )
62- assert .Equal (t , []byte {1 , 2 , 3 }, res .ReadableSlice ())
66+ t .Fatal ("pool is not recycling buffers" )
6367}
6468
65- // BenchmarkBufferPool_Clone demonstrates the cloning of a buffer without
66- // allocation if the pool is filled making the process very efficient.
67- func BenchmarkBufferPool_Clone ( b * testing. B ) {
68- pool := GetDefaultBufferPool ()
69- buffer := NewBuffer (1024 )
70- buffer . Write ( make ([] byte , 1024 ) )
69+ func TestSynchronizedBufferPool_Put_recyclesBuffer ( t * testing. T ) {
70+ pool := newBufferPool ( & sync. Pool {})
71+
72+ for range 100 {
73+ buffer := NewSharedBuffer ( NewBuffer (1024 ) )
74+ pool . Put ( buffer )
7175
72- for range b . N {
73- newBuffer := pool . Clone ( buffer )
74- pool . Put ( newBuffer )
76+ if res := pool . Get (); res != nil {
77+ return
78+ }
7579 }
80+
81+ t .Fatal ("pool is not recycling buffers" )
7682}
7783
7884// --- Helpers
7985
8086type capturingPool struct {
81- buffers []Buffer
87+ buffers []* SharedBuffer
8288}
8389
84- func (p * capturingPool ) Get () Buffer {
90+ func (p * capturingPool ) Get () * SharedBuffer {
8591 if len (p .buffers ) > 0 {
8692 value := p .buffers [0 ]
8793 p .buffers = p .buffers [1 :]
@@ -90,10 +96,6 @@ func (p *capturingPool) Get() Buffer {
9096 return nil
9197}
9298
93- func (p * capturingPool ) Put (value Buffer ) {
99+ func (p * capturingPool ) Put (value * SharedBuffer ) {
94100 p .buffers = append (p .buffers , value )
95101}
96-
97- func (p * capturingPool ) Clone (value Buffer ) Buffer {
98- return value
99- }
0 commit comments