From 13e1825dcb4a0907fdf51d191f3a1e9a1ac6491b Mon Sep 17 00:00:00 2001 From: q191201771 <191201771@qq.com> Date: Mon, 21 Oct 2019 16:51:00 +0800 Subject: [PATCH] package bufferpool: 1. global rename to default 2. new struct SharedBuffer --- pkg/bufferpool/{global.go => default.go} | 10 +++--- pkg/bufferpool/shared_buffer.go | 43 ++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 5 deletions(-) rename pkg/bufferpool/{global.go => default.go} (74%) create mode 100644 pkg/bufferpool/shared_buffer.go diff --git a/pkg/bufferpool/global.go b/pkg/bufferpool/default.go similarity index 74% rename from pkg/bufferpool/global.go rename to pkg/bufferpool/default.go index 497d8b8..0b84386 100644 --- a/pkg/bufferpool/global.go +++ b/pkg/bufferpool/default.go @@ -10,22 +10,22 @@ package bufferpool import "bytes" -var global BufferPool +var defaultPool BufferPool func Get(size int) *bytes.Buffer { - return global.Get(size) + return defaultPool.Get(size) } func Put(buf *bytes.Buffer) { - global.Put(buf) + defaultPool.Put(buf) } func RetrieveStatus() Status { - return global.RetrieveStatus() + return defaultPool.RetrieveStatus() } func Init(strategy Strategy) { - global = NewBufferPool(strategy) + defaultPool = NewBufferPool(strategy) } func init() { diff --git a/pkg/bufferpool/shared_buffer.go b/pkg/bufferpool/shared_buffer.go new file mode 100644 index 0000000..7a0d0d9 --- /dev/null +++ b/pkg/bufferpool/shared_buffer.go @@ -0,0 +1,43 @@ +// Copyright 2019, Chef. All rights reserved. +// https://github.com/q191201771/naza +// +// Use of this source code is governed by a MIT-style license +// that can be found in the License file. +// +// Author: Chef (191201771@qq.com) + +package bufferpool + +import ( + "bytes" + + "github.com/q191201771/naza/pkg/nazaatomic" +) + +type SharedBuffer struct { + *bytes.Buffer + pool BufferPool + count *nazaatomic.Uint32 +} + +func NewSharedBufferDefault(size int) *SharedBuffer { + return NewSharedBuffer(defaultPool, size) +} + +func NewSharedBuffer(pool BufferPool, size int) *SharedBuffer { + return &SharedBuffer{ + Buffer: pool.Get(size), + count: new(nazaatomic.Uint32), + } +} + +func (sb *SharedBuffer) Ref() *SharedBuffer { + sb.count.Increment() + return sb +} + +func (sb *SharedBuffer) ReleaseIfNeeded() { + if sb.count.Decrement() == 0 { + sb.pool.Put(sb.Buffer) + } +}