correctly precalculate the minimum free prefix length on alloc, so recalculation can be skipped for deeply nested inserts
This commit is contained in:
parent
c124d3c614
commit
b7216e783d
|
@ -112,12 +112,14 @@ func (t *tree) Alloc(bits int) *tree {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tofix := best
|
||||||
|
|
||||||
// the first insert can be into a new hi branch
|
// the first insert can be into a new hi branch
|
||||||
if best.lo != nil {
|
if best.lo != nil {
|
||||||
best.hi = &tree{
|
best.hi = &tree{
|
||||||
prefix: SplitPrefixHi(best.prefix),
|
prefix: SplitPrefixHi(best.prefix),
|
||||||
parent: best,
|
parent: best,
|
||||||
minfreelen: best.prefix.Bits() + 1,
|
minfreelen: best.prefix.Bits() + 2,
|
||||||
}
|
}
|
||||||
best = best.hi
|
best = best.hi
|
||||||
}
|
}
|
||||||
|
@ -127,12 +129,14 @@ func (t *tree) Alloc(bits int) *tree {
|
||||||
best.lo = &tree{
|
best.lo = &tree{
|
||||||
prefix: SplitPrefixLo(best.prefix),
|
prefix: SplitPrefixLo(best.prefix),
|
||||||
parent: best,
|
parent: best,
|
||||||
minfreelen: best.prefix.Bits() + 1,
|
minfreelen: best.prefix.Bits() + 2,
|
||||||
}
|
}
|
||||||
best = best.lo
|
best = best.lo
|
||||||
}
|
}
|
||||||
|
|
||||||
best.fixMinFreeAll()
|
best.fixMinFree()
|
||||||
|
tofix.fixMinFreeAll()
|
||||||
|
|
||||||
return best
|
return best
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,26 +146,25 @@ func (t *tree) fixMinFree() {
|
||||||
}
|
}
|
||||||
if t.Leaf() {
|
if t.Leaf() {
|
||||||
t.minfreelen = t.prefix.Addr().BitLen() + 1
|
t.minfreelen = t.prefix.Addr().BitLen() + 1
|
||||||
|
return
|
||||||
}
|
}
|
||||||
lofree := t.lo.calcfreelen(t)
|
lofree := t.lo.calcfreelen(t)
|
||||||
hifree := t.hi.calcfreelen(t)
|
hifree := t.hi.calcfreelen(t)
|
||||||
minfreelen := max(min(lofree, hifree), t.prefix.Bits()+1)
|
minfreelen := max(min(lofree, hifree), t.prefix.Bits()+1)
|
||||||
|
|
||||||
if t.minfreelen != minfreelen {
|
//if t.minfreelen != minfreelen {
|
||||||
//log.Printf("lo:%v, hi:%v\n", fixfree.lo == nil, fixfree.hi == nil)
|
// log.Printf("lo:%v, hi:%v\n", t.lo == nil, t.hi == nil)
|
||||||
//log.Printf("Fixing space for %q, lo: %d, hi: %d, old: %d, new: %d", fixfree.prefix, lofree, hifree, fixfree.minfreelen, minfreelen)
|
// log.Printf("Fixing space for %q, lo: %d, hi: %d, old: %d, new: %d", t.prefix, lofree, hifree, t.minfreelen, minfreelen)
|
||||||
t.minfreelen = minfreelen
|
//}
|
||||||
}
|
|
||||||
|
t.minfreelen = minfreelen
|
||||||
}
|
}
|
||||||
func (t *tree) fixMinFreeAll() {
|
func (t *tree) fixMinFreeAll() {
|
||||||
if t == nil {
|
if t == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if t.Leaf() {
|
|
||||||
t.minfreelen = t.prefix.Addr().BitLen() + 1
|
|
||||||
}
|
|
||||||
|
|
||||||
fixfree := t.parent
|
fixfree := t
|
||||||
|
|
||||||
for fixfree != nil {
|
for fixfree != nil {
|
||||||
fixfree.fixMinFree()
|
fixfree.fixMinFree()
|
||||||
|
|
Loading…
Reference in New Issue
Block a user