Skip to content

Commit

Permalink
chore: eliminate some useless methods from ring-buffer
Browse files Browse the repository at this point in the history
  • Loading branch information
panjf2000 committed Jan 30, 2022
1 parent 45ff7c0 commit 0e0b55a
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 72 deletions.
20 changes: 3 additions & 17 deletions pkg/buffer/elastic/elastic_ring_buffer.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ import (
"io"

"github.com/panjf2000/gnet/v2/pkg/buffer/ring"
bbPool "github.com/panjf2000/gnet/v2/pkg/pool/bytebuffer"
rbPool "github.com/panjf2000/gnet/v2/pkg/pool/ringbuffer"
)

Expand Down Expand Up @@ -157,25 +156,12 @@ func (b *RingBuffer) WriteString(s string) (int, error) {
return b.instance().WriteString(s)
}

// ByteBuffer returns all available read bytes. It does not move the read pointer and only copy the available data.
func (b *RingBuffer) ByteBuffer() *bbPool.ByteBuffer {
// Bytes returns all available read bytes. It does not move the read pointer and only copy the available data.
func (b *RingBuffer) Bytes() []byte {
if b.rb == nil {
return nil
}
return b.rb.ByteBuffer()
}

// WithByteBuffer combines the available read bytes and the given bytes. It does not move the read pointer and
// only copy the available data.
func (b *RingBuffer) WithByteBuffer(p []byte) *bbPool.ByteBuffer {
if b.rb == nil {
bb := bbPool.Get()
_, _ = bb.Write(p)
return bb
}

defer b.done()
return b.rb.WithByteBuffer(p)
return b.rb.Bytes()
}

// ReadFrom implements io.ReaderFrom.
Expand Down
49 changes: 9 additions & 40 deletions pkg/buffer/ring/ring_buffer.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import (
"io"

"github.com/panjf2000/gnet/v2/internal/toolkit"
bbPool "github.com/panjf2000/gnet/v2/pkg/pool/bytebuffer"
bsPool "github.com/panjf2000/gnet/v2/pkg/pool/byteslice"
)

Expand Down Expand Up @@ -313,62 +312,32 @@ func (rb *Buffer) WriteString(s string) (int, error) {
return rb.Write(toolkit.StringToBytes(s))
}

// ByteBuffer returns all available read bytes. It does not move the read pointer and only copy the available data.
func (rb *Buffer) ByteBuffer() *bbPool.ByteBuffer {
// Bytes returns all available read bytes. It does not move the read pointer and only copy the available data.
func (rb *Buffer) Bytes() []byte {
if rb.isEmpty {
return nil
} else if rb.w == rb.r {
bb := bbPool.Get()
_, _ = bb.Write(rb.buf[rb.r:])
_, _ = bb.Write(rb.buf[:rb.w])
var bb []byte
bb = append(bb, rb.buf[rb.r:]...)
bb = append(bb, rb.buf[:rb.w]...)
return bb
}

bb := bbPool.Get()
var bb []byte
if rb.w > rb.r {
_, _ = bb.Write(rb.buf[rb.r:rb.w])
bb = append(bb, rb.buf[rb.r:rb.w]...)
return bb
}

_, _ = bb.Write(rb.buf[rb.r:])
bb = append(bb, rb.buf[rb.r:]...)

if rb.w != 0 {
_, _ = bb.Write(rb.buf[:rb.w])
bb = append(bb, rb.buf[:rb.w]...)
}

return bb
}

// WithByteBuffer combines the available read bytes and the given bytes. It does not move the read pointer and
// only copy the available data.
func (rb *Buffer) WithByteBuffer(b []byte) *bbPool.ByteBuffer {
if rb.isEmpty {
return &bbPool.ByteBuffer{B: b}
} else if rb.w == rb.r {
bb := bbPool.Get()
_, _ = bb.Write(rb.buf[rb.r:])
_, _ = bb.Write(rb.buf[:rb.w])
_, _ = bb.Write(b)
return bb
}

bb := bbPool.Get()
if rb.w > rb.r {
_, _ = bb.Write(rb.buf[rb.r:rb.w])
_, _ = bb.Write(b)
return bb
}

_, _ = bb.Write(rb.buf[rb.r:])

if rb.w != 0 {
_, _ = bb.Write(rb.buf[:rb.w])
}
_, _ = bb.Write(b)

return bb
}

// ReadFrom implements io.ReaderFrom.
func (rb *Buffer) ReadFrom(r io.Reader) (n int64, err error) {
var m int
Expand Down
28 changes: 14 additions & 14 deletions pkg/buffer/ring/ring_buffer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ func TestRingBuffer_Write(t *testing.T) {
assert.EqualValuesf(t, 16, n, "expect write 16 bytes but got %d", n)
assert.EqualValuesf(t, 16, rb.Buffered(), "expect len 16 bytes but got %d. r.w=%d, r.r=%d", rb.Buffered(), rb.w, rb.r)
assert.EqualValuesf(t, 48, rb.Available(), "expect free 48 bytes but got %d. r.w=%d, r.r=%d", rb.Available(), rb.w, rb.r)
assert.EqualValuesf(t, data, rb.ByteBuffer().Bytes(), "expect 4 abcd but got %s. r.w=%d, r.r=%d", rb.ByteBuffer().Bytes(), rb.w, rb.r)
assert.EqualValuesf(t, data, rb.Bytes(), "expect 4 abcd but got %s. r.w=%d, r.r=%d", rb.Bytes(), rb.w, rb.r)

// check empty or full
assert.False(t, rb.IsEmpty(), "expect IsEmpty is false but got true")
Expand All @@ -60,7 +60,7 @@ func TestRingBuffer_Write(t *testing.T) {
assert.EqualValuesf(t, 64, rb.Buffered(), "expect len 64 bytes but got %d. r.w=%d, r.r=%d", rb.Buffered(), rb.w, rb.r)
assert.EqualValuesf(t, 0, rb.Available(), "expect free 0 bytes but got %d. r.w=%d, r.r=%d", rb.Available(), rb.w, rb.r)
assert.EqualValuesf(t, 0, rb.w, "expect r.w=0 but got %d. r.r=%d", rb.w, rb.r)
assert.EqualValuesf(t, []byte(strings.Repeat("abcd", 16)), rb.ByteBuffer().Bytes(), "expect 16 abcd but got %s. r.w=%d, r.r=%d", rb.ByteBuffer().Bytes(), rb.w, rb.r)
assert.EqualValuesf(t, []byte(strings.Repeat("abcd", 16)), rb.Bytes(), "expect 16 abcd but got %s. r.w=%d, r.r=%d", rb.Bytes(), rb.w, rb.r)

// check empty or full
assert.False(t, rb.IsEmpty(), "expect IsEmpty is false but got true")
Expand Down Expand Up @@ -90,7 +90,7 @@ func TestRingBuffer_Write(t *testing.T) {
assert.False(t, rb.IsEmpty(), "expect IsEmpty is false but got true")
assert.False(t, rb.IsFull(), "expect IsFull is false but got true")

assert.EqualValuesf(t, []byte(strings.Repeat("abcd", 20)), rb.ByteBuffer().Bytes(), "expect 16 abcd but got %s. r.w=%d, r.r=%d", rb.ByteBuffer().Bytes(), rb.w, rb.r)
assert.EqualValuesf(t, []byte(strings.Repeat("abcd", 20)), rb.Bytes(), "expect 16 abcd but got %s. r.w=%d, r.r=%d", rb.Bytes(), rb.w, rb.r)

rb.Reset()
size = rb.Cap()
Expand All @@ -104,7 +104,7 @@ func TestRingBuffer_Write(t *testing.T) {
assert.EqualValuesf(t, 3, rb.Buffered(), "expect len 3 bytes but got %d. r.w=%d, r.r=%d", rb.Buffered(), rb.w, rb.r)
_, _ = rb.Write([]byte(strings.Repeat("abcd", 15)))

assert.EqualValuesf(t, []byte("bcd"+strings.Repeat("abcd", 15)), rb.ByteBuffer().Bytes(), "expect 63 ... but got %s. r.w=%d, r.r=%d", rb.ByteBuffer().Bytes(), rb.w, rb.r)
assert.EqualValuesf(t, []byte("bcd"+strings.Repeat("abcd", 15)), rb.Bytes(), "expect 63 ... but got %s. r.w=%d, r.r=%d", rb.Bytes(), rb.w, rb.r)

rb.Reset()
n, _ = rb.Write([]byte(strings.Repeat("abcd", 32)))
Expand All @@ -115,7 +115,7 @@ func TestRingBuffer_Write(t *testing.T) {
n, _ = rb.Write([]byte(strings.Repeat("1234", 4)))
assert.EqualValuesf(t, 16, n, "expect write 16 bytes but got %d", n)
assert.EqualValuesf(t, 0, rb.Available(), "expect free 0 bytes but got %d. r.w=%d, r.r=%d", rb.Available(), rb.w, rb.r)
assert.EqualValuesf(t, []byte(strings.Repeat("abcd", 32)+strings.Repeat("1234", 4)), append(buf, rb.ByteBuffer().Bytes()...), "expect 16 abcd and 4 1234 but got %s. r.w=%d, r.r=%d", rb.ByteBuffer().Bytes(), rb.w, rb.r)
assert.EqualValuesf(t, []byte(strings.Repeat("abcd", 32)+strings.Repeat("1234", 4)), append(buf, rb.Bytes()...), "expect 16 abcd and 4 1234 but got %s. r.w=%d, r.r=%d", rb.Bytes(), rb.w, rb.r)
}

func TestZeroRingBuffer(t *testing.T) {
Expand All @@ -133,7 +133,7 @@ func TestZeroRingBuffer(t *testing.T) {
assert.EqualValuesf(t, DefaultBufferSize, rb.Len(), "expect rb.Len()=%d, but got rb.Len()=%d", DefaultBufferSize, rb.Len())
assert.EqualValuesf(t, DefaultBufferSize, rb.Cap(), "expect rb.Cap()=%d, but got rb.Cap()=%d", DefaultBufferSize, rb.Cap())
assert.Truef(t, rb.r == 0 && rb.w == 48 && rb.size == DefaultBufferSize, "expect rb.r=0, rb.w=48, rb.size=64, rb.mask=63, but got rb.r=%d, rb.w=%d, rb.size=%d", rb.r, rb.w, rb.size)
assert.EqualValues(t, buf, rb.ByteBuffer().Bytes(), "expect it is equal")
assert.EqualValues(t, buf, rb.Bytes(), "expect it is equal")
_, _ = rb.Discard(48)
assert.Truef(t, rb.IsEmpty() && rb.r == 0 && rb.w == 0, "expect rb is empty and rb.r=rb.w=0, but got rb.r=%d and rb.w=%d", rb.r, rb.w)
}
Expand All @@ -154,7 +154,7 @@ func TestRingBufferGrow(t *testing.T) {
assert.EqualValues(t, 2*DefaultBufferSize, rb.Len())
assert.EqualValues(t, DefaultBufferSize+1, rb.Buffered())
assert.EqualValues(t, DefaultBufferSize-1, rb.Available())
assert.EqualValues(t, data, rb.ByteBuffer().Bytes())
assert.EqualValues(t, data, rb.Bytes())

rb = New(DefaultBufferSize)
newData := make([]byte, 3*512)
Expand All @@ -168,7 +168,7 @@ func TestRingBufferGrow(t *testing.T) {
assert.EqualValues(t, 2*DefaultBufferSize, rb.Len())
assert.EqualValues(t, 3*512, rb.Buffered())
assert.EqualValues(t, 512, rb.Available())
assert.EqualValues(t, newData, rb.ByteBuffer().Bytes())
assert.EqualValues(t, newData, rb.Bytes())

rb.Reset()
data = make([]byte, bufferGrowThreshold)
Expand All @@ -182,7 +182,7 @@ func TestRingBufferGrow(t *testing.T) {
assert.EqualValues(t, bufferGrowThreshold, rb.Len())
assert.EqualValues(t, bufferGrowThreshold, rb.Buffered())
assert.EqualValues(t, 0, rb.Available())
assert.EqualValues(t, data, rb.ByteBuffer().Bytes())
assert.EqualValues(t, data, rb.Bytes())
newData = make([]byte, bufferGrowThreshold/2+1)
n, err = rand.Read(newData)
assert.NoError(t, err, "failed to generate random data")
Expand All @@ -194,7 +194,7 @@ func TestRingBufferGrow(t *testing.T) {
assert.EqualValues(t, 1.25*(1.25*bufferGrowThreshold), rb.Len())
assert.EqualValues(t, 1.5*bufferGrowThreshold+1, rb.Buffered())
assert.EqualValues(t, 1.25*(1.25*bufferGrowThreshold)-rb.Buffered(), rb.Available())
assert.EqualValues(t, append(data, newData...), rb.ByteBuffer().Bytes())
assert.EqualValues(t, append(data, newData...), rb.Bytes())
}

func TestRingBuffer_Read(t *testing.T) {
Expand Down Expand Up @@ -270,7 +270,7 @@ func TestRingBuffer_ByteInterface(t *testing.T) {
_ = rb.WriteByte('a')
assert.EqualValuesf(t, 1, rb.Buffered(), "expect len 1 byte but got %d. r.w=%d, r.r=%d", rb.Buffered(), rb.w, rb.r)
assert.EqualValuesf(t, 1, rb.Available(), "expect free 1 byte but got %d. r.w=%d, r.r=%d", rb.Available(), rb.w, rb.r)
assert.EqualValuesf(t, []byte{'a'}, rb.ByteBuffer().Bytes(), "expect a but got %s. r.w=%d, r.r=%d", rb.ByteBuffer().Bytes(), rb.w, rb.r)
assert.EqualValuesf(t, []byte{'a'}, rb.Bytes(), "expect a but got %s. r.w=%d, r.r=%d", rb.Bytes(), rb.w, rb.r)
// check empty or full
assert.Falsef(t, rb.IsEmpty(), "expect IsEmpty is false but got true")
assert.False(t, rb.IsFull(), "expect IsFull is false but got true")
Expand All @@ -279,7 +279,7 @@ func TestRingBuffer_ByteInterface(t *testing.T) {
_ = rb.WriteByte('b')
assert.EqualValuesf(t, 2, rb.Buffered(), "expect len 2 bytes but got %d. r.w=%d, r.r=%d", rb.Buffered(), rb.w, rb.r)
assert.EqualValuesf(t, 0, rb.Available(), "expect free 0 byte but got %d. r.w=%d, r.r=%d", rb.Available(), rb.w, rb.r)
assert.EqualValuesf(t, []byte{'a', 'b'}, rb.ByteBuffer().Bytes(), "expect a but got %s. r.w=%d, r.r=%d", rb.ByteBuffer().Bytes(), rb.w, rb.r)
assert.EqualValuesf(t, []byte{'a', 'b'}, rb.Bytes(), "expect a but got %s. r.w=%d, r.r=%d", rb.Bytes(), rb.w, rb.r)
// check empty or full
assert.False(t, rb.IsEmpty(), "expect IsEmpty is false but got true")
assert.True(t, rb.IsFull(), "expect IsFull is true but got false")
Expand All @@ -288,7 +288,7 @@ func TestRingBuffer_ByteInterface(t *testing.T) {
_ = rb.WriteByte('c')
assert.EqualValuesf(t, 3, rb.Buffered(), "expect len 3 bytes but got %d. r.w=%d, r.r=%d", rb.Buffered(), rb.w, rb.r)
assert.EqualValuesf(t, 1, rb.Available(), "expect free 1 byte but got %d. r.w=%d, r.r=%d", rb.Available(), rb.w, rb.r)
assert.EqualValuesf(t, []byte{'a', 'b', 'c'}, rb.ByteBuffer().Bytes(), "expect a but got %s. r.w=%d, r.r=%d", rb.ByteBuffer().Bytes(), rb.w, rb.r)
assert.EqualValuesf(t, []byte{'a', 'b', 'c'}, rb.Bytes(), "expect a but got %s. r.w=%d, r.r=%d", rb.Bytes(), rb.w, rb.r)
// check empty or full
assert.False(t, rb.IsEmpty(), "expect IsEmpty is false but got true")
assert.False(t, rb.IsFull(), "expect IsFull is false but got true")
Expand All @@ -299,7 +299,7 @@ func TestRingBuffer_ByteInterface(t *testing.T) {
assert.EqualValuesf(t, 'a', b, "expect a but got %c. r.w=%d, r.r=%d", b, rb.w, rb.r)
assert.EqualValuesf(t, 2, rb.Buffered(), "expect len 2 byte but got %d. r.w=%d, r.r=%d", rb.Buffered(), rb.w, rb.r)
assert.EqualValuesf(t, 2, rb.Available(), "expect free 2 byte but got %d. r.w=%d, r.r=%d", rb.Available(), rb.w, rb.r)
assert.EqualValuesf(t, []byte{'b', 'c'}, rb.ByteBuffer().Bytes(), "expect a but got %s. r.w=%d, r.r=%d", rb.ByteBuffer().Bytes(), rb.w, rb.r)
assert.EqualValuesf(t, []byte{'b', 'c'}, rb.Bytes(), "expect a but got %s. r.w=%d, r.r=%d", rb.Bytes(), rb.w, rb.r)
// check empty or full
assert.False(t, rb.IsEmpty(), "expect IsEmpty is false but got true")
assert.False(t, rb.IsFull(), "expect IsFull is false but got true")
Expand Down
2 changes: 1 addition & 1 deletion pkg/pool/ringbuffer/ringbuffer.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ func (p *Pool) Get() *RingBuffer {

// Put returns byte buffer to the pool.
//
// ByteBuffer.B mustn't be touched after returning it to the pool,
// RingBuffer mustn't be touched after returning it to the pool,
// otherwise, data races will occur.
func Put(b *RingBuffer) { builtinPool.Put(b) }

Expand Down

0 comments on commit 0e0b55a

Please sign in to comment.