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:
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.
|
||||
|
||||
8
pool.go
8
pool.go
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user