You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
naza/pkg/slicebytepool/shared_slicebyte.go

75 lines
1.5 KiB
Go

// 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 slicebytepool
import (
"github.com/q191201771/naza/pkg/nazaatomic"
)
type SharedSliceByte struct {
Core []byte
pool SliceBytePool
count nazaatomic.Uint32
}
type SharedSliceByteOption struct {
pool SliceBytePool
}
var defaultSharedSliceByteOption = SharedSliceByteOption{
pool: defaultPool,
}
type ModSharedSliceByteOption func(option *SharedSliceByteOption)
func WithPool(pool SliceBytePool) ModSharedSliceByteOption {
return func(option *SharedSliceByteOption) {
option.pool = pool
}
}
func NewSharedSliceByte(size int, modOptions ...ModSharedSliceByteOption) *SharedSliceByte {
option := defaultSharedSliceByteOption
for _, fn := range modOptions {
fn(&option)
}
var ssb SharedSliceByte
ssb.Core = option.pool.Get(size)
ssb.pool = option.pool
ssb.count.Store(1)
return &ssb
}
func WrapSharedSliceByte(b []byte, modOptions ...ModSharedSliceByteOption) *SharedSliceByte {
option := SharedSliceByteOption{
pool: defaultPool,
}
for _, fn := range modOptions {
fn(&option)
}
var ssb SharedSliceByte
ssb.Core = b
ssb.pool = option.pool
ssb.count.Store(1)
return &ssb
}
func (ssb *SharedSliceByte) Ref() *SharedSliceByte {
ssb.count.Increment()
return ssb
}
func (ssb *SharedSliceByte) ReleaseIfNeeded() {
if ssb.count.Decrement() == 0 {
ssb.pool.Put(ssb.Core)
}
}