in alloc.go [788:825]
func readAllocatorState(a *allocator, f *File, meta *metaPage, opts Options) reason {
if a.maxSize > 0 {
a.maxPages = a.maxSize / a.pageSize
}
a.data.endMarker = meta.dataEndMarker.Get()
a.meta.endMarker = meta.metaEndMarker.Get()
a.metaTotal = uint(meta.metaTotal.Get())
a.freelistRoot = meta.freelist.Get()
if a.freelistRoot == 0 {
return nil
}
var metaList, dataList freelist
ids, err := readFreeList(f.mmapedPage, a.freelistRoot, func(isMeta bool, region region) {
lst := &dataList
if isMeta {
lst = &metaList
}
lst.avail += uint(region.count)
lst.regions.Add(region)
})
if err != nil {
return err
}
dataList.regions.Sort()
dataList.regions.MergeAdjacent()
metaList.regions.Sort()
metaList.regions.MergeAdjacent()
a.data.freelist = dataList
a.meta.freelist = metaList
a.freelistPages = ids.Regions()
return nil
}