Skip to content

Commit

Permalink
fix: don't shrink ring-buffer when it's empty
Browse files Browse the repository at this point in the history
  • Loading branch information
panjf2000 committed Jul 18, 2021
1 parent 5548133 commit 545baa9
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 34 deletions.
20 changes: 10 additions & 10 deletions ringbuffer/ring_buffer.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import (
"github.com/panjf2000/gnet/pool/bytebuffer"
)

const initSize = 1 << 12 // 4096 bytes for the first-time allocation on ring-buffer.
const defaultBufferSize = 1 << 12 // 4096 bytes for the first-time allocation on ring-buffer.

// ErrIsEmpty will be returned when trying to read a empty ring-buffer.
var ErrIsEmpty = errors.New("ring-buffer is empty")
Expand Down Expand Up @@ -374,19 +374,19 @@ func (r *RingBuffer) Reset() {
r.r, r.w = 0, 0

// Shrink the internal buffer for saving memory.
newCap := r.size >> 1
newBuf := make([]byte, newCap)
r.buf = newBuf
r.size = newCap
r.mask = newCap - 1
// newCap := r.size >> 1
// newBuf := make([]byte, newCap)
// r.buf = newBuf
// r.size = newCap
// r.mask = newCap - 1
}

func (r *RingBuffer) malloc(cap int) {
func (r *RingBuffer) malloc(n int) {
var newCap int
if r.size == 0 && cap < initSize {
newCap = initSize
if r.size == 0 && n < defaultBufferSize {
newCap = defaultBufferSize
} else {
newCap = internal.CeilToPowerOfTwo(r.size + cap)
newCap = internal.CeilToPowerOfTwo(r.size + n)
}
newBuf := make([]byte, newCap)
oldLen := r.Length()
Expand Down
48 changes: 24 additions & 24 deletions ringbuffer/ring_buffer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -208,10 +208,10 @@ func TestZeroRingBuffer(t *testing.T) {
}
buf := []byte(strings.Repeat("1234", 12))
_, _ = rb.Write(buf)
if !(rb.Len() == initSize && rb.Cap() == initSize) {
if !(rb.Len() == defaultBufferSize && rb.Cap() == defaultBufferSize) {
t.Fatalf("expect rb.Len()=64 and rb.Cap=64, but got rb.Len()=%d and rb.Cap()=%d", rb.Len(), rb.Cap())
}
if !(rb.r == 0 && rb.w == 48 && rb.size == initSize && rb.mask == initSize-1) {
if !(rb.r == 0 && rb.w == 48 && rb.size == defaultBufferSize && rb.mask == defaultBufferSize-1) {
t.Fatalf("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.mask=%d",
rb.r, rb.w, rb.size, rb.mask)
}
Expand Down Expand Up @@ -276,7 +276,7 @@ func TestRingBuffer_Read(t *testing.T) {
if rb.Length() != 0 {
t.Fatalf("expect len 0 bytes but got %d. r.w=%d, r.r=%d", rb.Length(), rb.w, rb.r)
}
if rb.Free() != 32 {
if rb.Free() != 64 {
t.Fatalf("expect free 64 bytes but got %d. r.w=%d, r.r=%d", rb.Free(), rb.w, rb.r)
}
if rb.r != 0 {
Expand All @@ -296,7 +296,7 @@ func TestRingBuffer_Read(t *testing.T) {
if rb.Length() != 0 {
t.Fatalf("expect len 0 bytes but got %d. r.w=%d, r.r=%d", rb.Length(), rb.w, rb.r)
}
if rb.Free() != 64 {
if rb.Free() != 128 {
t.Fatalf("expect free 128 bytes but got %d. r.w=%d, r.r=%d", rb.Free(), rb.w, rb.r)
}
if rb.r != 0 {
Expand Down Expand Up @@ -464,7 +464,7 @@ func TestRingBuffer_ByteInterface(t *testing.T) {
if rb.Length() != 0 {
t.Fatalf("expect len 0 byte but got %d. r.w=%d, r.r=%d", rb.Length(), rb.w, rb.r)
}
if rb.Free() != 2 {
if rb.Free() != 4 {
t.Fatalf("expect free 4 byte but got %d. r.w=%d, r.r=%d", rb.Free(), rb.w, rb.r)
}
// check empty or full
Expand All @@ -476,22 +476,22 @@ func TestRingBuffer_ByteInterface(t *testing.T) {
}
}

func TestShrinkBuffer(t *testing.T) {
testStr := "Hello World!"
testCap := 1024

rb := New(testCap)
_, _ = rb.WriteString(testStr)
rb.PeekAll()
rb.Discard(len(testStr))
if rb.Cap() != testCap/2 {
t.Fatalf("expect buffer capacity %d, but got %d", testCap/2, rb.Cap())
}

_, _ = rb.WriteString(testStr)
rb.PeekAll()
rb.Reset()
if rb.Cap() != testCap/4 {
t.Fatalf("expect buffer capacity %d, but got %d", testCap/4, rb.Cap())
}
}
// func TestShrinkBuffer(t *testing.T) {
// testStr := "Hello World!"
// testCap := 1024
//
// rb := New(testCap)
// _, _ = rb.WriteString(testStr)
// rb.PeekAll()
// rb.Discard(len(testStr))
// if rb.Cap() != testCap/2 {
// t.Fatalf("expect buffer capacity %d, but got %d", testCap/2, rb.Cap())
// }
//
// _, _ = rb.WriteString(testStr)
// rb.PeekAll()
// rb.Reset()
// if rb.Cap() != testCap/4 {
// t.Fatalf("expect buffer capacity %d, but got %d", testCap/4, rb.Cap())
// }
// }

0 comments on commit 545baa9

Please sign in to comment.