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:
27
item.go
27
item.go
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user