diff --git a/item.go b/item.go index 684335f..c2c2f7c 100644 --- a/item.go +++ b/item.go @@ -97,9 +97,10 @@ func (b *Item[T]) destroybystat(stat status) { // ManualDestroy item and put it back to pool. // -// Calling this method without setting pool.SetManualDestroy(true) -// can probably cause panic. +// Calling this method only when you're sure that +// no one will use it, or it will cause a panic. func (b *Item[T]) ManualDestroy() { + runtime.SetFinalizer(b, nil) b.destroybystat(status(atomic.SwapUintptr( (*uintptr)(&b.stat), uintptr(destroyedstatus), ))) @@ -110,9 +111,6 @@ func (b *Item[T]) ManualDestroy() { // Only can call once. func (b *Item[T]) setautodestroy() *Item[T] { runtime.SetFinalizer(b, func(item *Item[T]) { - if item.stat.hasdestroyed() { - panic("unexpected hasdestroyed") - } // no one is using, no concurrency issue. item.destroybystat(item.stat) }) diff --git a/pbuf/buffer_test.go b/pbuf/buffer_test.go index 45fb60a..d6dd479 100644 --- a/pbuf/buffer_test.go +++ b/pbuf/buffer_test.go @@ -53,6 +53,8 @@ func testBuffer(buf *OBuffer, t *testing.T) { } }) + bufcp.ManualDestroy() + runtime.GC() runtime.Gosched() runtime.GC() diff --git a/pbuf/bytes.go b/pbuf/bytes.go index 6bec3a7..d7484bd 100644 --- a/pbuf/bytes.go +++ b/pbuf/bytes.go @@ -119,3 +119,8 @@ func (b UserBytes[USRDAT]) SliceTo(to int) UserBytes[USRDAT] { func (b UserBytes[USRDAT]) Slice(from, to int) UserBytes[USRDAT] { return UserBytes[USRDAT]{buf: b.buf, a: b.a + from, b: b.a + to} } + +// ManualDestroy please refer to Item.ManualDestroy(). +func (b UserBytes[USRDAT]) ManualDestroy() { + b.buf.ManualDestroy() +} diff --git a/pool.go b/pool.go index 782c296..8d8cb4a 100644 --- a/pool.go +++ b/pool.go @@ -14,7 +14,6 @@ type Pool[T any] struct { pooler Pooler[T] pool sync.Pool noputbak bool - manudstr bool } // NewPool make a new pool from custom pooler. @@ -34,12 +33,6 @@ func (pool *Pool[T]) SetNoPutBack(on bool) { pool.noputbak = on } -// SetManualDestroy mark that user must manually -// run Item.Destroy(). -func (pool *Pool[T]) SetManualDestroy(on bool) { - pool.manudstr = on -} - func (pool *Pool[T]) incin() { atomic.AddInt32(&pool.countin, 1) } @@ -63,16 +56,11 @@ func (pool *Pool[T]) newempty() *Item[T] { } item.stat = status(0) pool.incout() - if !pool.manudstr { - item.setautodestroy() - } - return item + return item.setautodestroy() } func (pool *Pool[T]) put(item *Item[T]) { - if !pool.manudstr { - runtime.SetFinalizer(item, nil) - } + runtime.SetFinalizer(item, nil) item.cfg = nil