1
0
mirror of https://github.com/fumiama/orbyte.git synced 2026-06-12 14:10:53 +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.