func readAllocatorState()

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
}