diff --git a/fw/table/pit-cs-tree.go b/fw/table/pit-cs-tree.go index d1252aff..404abab5 100644 --- a/fw/table/pit-cs-tree.go +++ b/fw/table/pit-cs-tree.go @@ -61,7 +61,7 @@ type pitCsTreeNode struct { // NewPitCS creates a new combined PIT-CS for a forwarding thread. func NewPitCS(onExpiration OnPitExpiration) *PitCsTree { pitCs := new(PitCsTree) - pitCs.root = PitCsPools.PitCsTreeNode.Get() + pitCs.root = PitCsPools.PitCsTreeNode.New() pitCs.root.component = enc.Component{} // zero component pitCs.onExpiration = onExpiration pitCs.pitTokens = make([]*nameTreePitEntry, pitTokenLookupTableSize) @@ -168,8 +168,11 @@ func (p *PitCsTree) RemoveInterest(pitEntry PitEntry) bool { entry.node.pruneIfEmpty() p.nPitEntries-- - // leave the entry in the token table, but mark it as invalid - // this stops it from being garbage collected and makes pool effective + // remove entry from pit token lookup table + tokIdx := p.pitTokenIdx(entry.Token()) + if p.pitTokens[tokIdx] == entry { + p.pitTokens[tokIdx] = nil + } // now it is invalid to use the entry entry.encname = nil // invalidate @@ -307,8 +310,8 @@ func (p *pitCsTreeNode) getChildrenCount() int { func (p *pitCsTreeNode) pruneIfEmpty() { for curNode := p; curNode.parent != nil && curNode.getChildrenCount() == 0 && len(curNode.pitEntries) == 0 && curNode.csEntry == nil; curNode = curNode.parent { - PitCsPools.PitCsTreeNode.Put(curNode) delete(curNode.parent.children, curNode.component.Hash()) + PitCsPools.PitCsTreeNode.Put(curNode) } } diff --git a/std/types/sync_pool/sync_pool.go b/std/types/sync_pool/sync_pool.go index 6d61f39d..c9109c34 100644 --- a/std/types/sync_pool/sync_pool.go +++ b/std/types/sync_pool/sync_pool.go @@ -18,6 +18,13 @@ func New[T any](init func() T, reset func(T)) SyncPool[T] { } } +// New creates a new object of type T. +func (p *SyncPool[T]) New() T { + val := p.pool.New().(T) + p.reset(val) + return val +} + // Get returns a new T from the pool. func (p *SyncPool[T]) Get() T { val := p.pool.Get().(T)