1
0
mirror of https://github.com/fumiama/orbyte.git synced 2026-06-05 02:00:30 +08:00

fix(item): trans destroy procedure

This commit is contained in:
源文雨
2025-02-25 13:59:39 +09:00
parent 6a0442eaa7
commit 8c5e0cfad0
2 changed files with 21 additions and 14 deletions

27
item.go
View File

@@ -37,7 +37,7 @@ func (b *Item[T]) Trans() (tb *Item[T]) {
(*uintptr)(&b.stat), uintptr(destroyedstatus),
))
tb.stat.setintrans(true)
b.pool.put(b)
b.destroybystat(status(0))
return tb
}
@@ -83,20 +83,29 @@ func (b *Item[T]) Copy() (cb *Item[T]) {
return
}
// Destroy item and put it back to pool.
func (b *Item[T]) Destroy() {
stat := status(atomic.SwapUintptr(
(*uintptr)(&b.stat), uintptr(destroyedstatus),
))
if stat.hasdestroyed() {
func (b *Item[T]) destroybystat(stat status) {
switch {
case stat.hasdestroyed():
panic("use after destroy")
}
if !stat.isintrans() && stat.isbuffered() {
case stat.isintrans():
var v T
b.val = v
case stat.isbuffered():
b.pool.pooler.Reset(&b.val)
default:
var v T
b.val = v
}
b.pool.put(b)
}
// Destroy item and put it back to pool.
func (b *Item[T]) Destroy() {
b.destroybystat(status(atomic.SwapUintptr(
(*uintptr)(&b.stat), uintptr(destroyedstatus),
)))
}
// setautodestroy item on GC.
//
// Only can call once.

View File

@@ -63,14 +63,12 @@ func (pool *Pool[T]) newempty() *Item[T] {
func (pool *Pool[T]) put(item *Item[T]) {
runtime.SetFinalizer(item, nil)
item.stat.setdestroyed(true)
item.cfg = nil
if pool.isstrict {
return
}
item.cfg = nil
var dt T
item.val = dt
pool.pool.Put(item)
pool.decout()