package bbolt
import
func ( *freelist) () int {
:= 0
for , := range .forwardMap {
+= int()
}
return
}
func ( *freelist) ( txid, int) pgid {
if == 0 {
return 0
}
if , := .freemaps[uint64()]; {
for := range {
.delSpan(, uint64())
.allocs[] =
for := pgid(0); < pgid(); ++ {
delete(.cache, +)
}
return
}
}
for , := range .freemaps {
if < uint64() {
continue
}
for := range {
.delSpan(, uint64())
.allocs[] =
:= - uint64()
.addSpan(+pgid(), )
for := pgid(0); < pgid(); ++ {
delete(.cache, +pgid())
}
return
}
}
return 0
}
func ( *freelist) ( []pgid) {
.init()
.reindex()
}
func ( *freelist) () []pgid {
:= .free_count()
if == 0 {
return nil
}
:= make([]pgid, 0, )
for , := range .forwardMap {
for := 0; < int(); ++ {
= append(, +pgid())
}
}
sort.Sort(pgids())
return
}
func ( *freelist) ( pgids) {
for , := range {
.mergeWithExistingSpan()
}
}
func ( *freelist) ( pgid) {
:= - 1
:= + 1
, := .backwardMap[]
, := .forwardMap[]
:=
:= uint64(1)
if {
:= + 1 - pgid()
.delSpan(, )
-= pgid()
+=
}
if {
.delSpan(, )
+=
}
.addSpan(, )
}
func ( *freelist) ( pgid, uint64) {
.backwardMap[-1+pgid()] =
.forwardMap[] =
if , := .freemaps[]; ! {
.freemaps[] = make(map[pgid]struct{})
}
.freemaps[][] = struct{}{}
}
func ( *freelist) ( pgid, uint64) {
delete(.forwardMap, )
delete(.backwardMap, +pgid(-1))
delete(.freemaps[], )
if len(.freemaps[]) == 0 {
delete(.freemaps, )
}
}
func ( *freelist) ( []pgid) {
if len() == 0 {
return
}
:= uint64(1)
:= [0]
if !sort.SliceIsSorted([]pgid(), func(, int) bool { return [] < [] }) {
panic("pgids not sorted")
}
.freemaps = make(map[uint64]pidSet)
.forwardMap = make(map[pgid]uint64)
.backwardMap = make(map[pgid]uint64)
for := 1; < len(); ++ {
if [] == [-1]+1 {
++
} else {
.addSpan(, )
= 1
= []
}
}
if != 0 && != 0 {
.addSpan(, )
}
}