mirror of
https://github.com/duanhf2012/origin.git
synced 2026-02-03 22:45:13 +08:00
优化内存池,当递归重复释放时报错
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user