优化内存池,当递归重复释放时报错

This commit is contained in:
orgin
2022-06-27 19:46:21 +08:00
parent 173d84f7e6
commit 9945c29a5c

View File

@@ -51,7 +51,6 @@ func NewPool(C chan interface{},New func()interface{}) *Pool{
func NewPoolEx(C chan IPoolData,New func()IPoolData) *PoolEx{ func NewPoolEx(C chan IPoolData,New func()IPoolData) *PoolEx{
var pool PoolEx var pool PoolEx
pool.C = C pool.C = C
//pool.New = New
pool.syncPool.New = func() interface{} { pool.syncPool.New = func() interface{} {
return New() return New()
} }
@@ -61,10 +60,18 @@ func NewPoolEx(C chan IPoolData,New func()IPoolData) *PoolEx{
func (pool *PoolEx) Get() IPoolData{ func (pool *PoolEx) Get() IPoolData{
select { select {
case d := <-pool.C: case d := <-pool.C:
if d.IsRef() {
panic("Pool data is in use.")
}
d.Ref() d.Ref()
return d return d
default: default:
data := pool.syncPool.Get().(IPoolData) data := pool.syncPool.Get().(IPoolData)
if data.IsRef() {
panic("Pool data is in use.")
}
data.Ref() data.Ref()
return data return data
} }
@@ -76,7 +83,10 @@ func (pool *PoolEx) Put(data IPoolData){
if data.IsRef() == false { if data.IsRef() == false {
panic("Repeatedly freeing memory") panic("Repeatedly freeing memory")
} }
//提前解引用,防止递归释放
data.UnRef()
data.Reset() data.Reset()
//再次解引用防止Rest时错误标记
data.UnRef() data.UnRef()
select { select {
case pool.C <- data: case pool.C <- data: