in alloc.go [457:512]
func (mm *metaManager) tryGrow(
st *txAllocState,
count uint,
withOverflow bool,
) bool {
da := mm.DataAllocator()
avail := da.Avail(st)
tracef("try grow meta area pages=%v, avail=%v\n", count, avail)
if count == 0 {
return true
}
if avail < count {
if !withOverflow {
traceln("can not grow meta area yet")
return false
}
da.AllocRegionsWith(st, avail, func(reg region) {
mm.transferToMeta(st, reg)
})
// allocate from overflow area
required := count - avail
if required > 0 {
traceln("try to grow overflow area")
}
allocFromArea(&st.meta, &mm.meta.endMarker, required, func(reg region) {
// st.manager.fromOverflow.Add(reg)
n := uint(reg.count)
mm.onGrow(st, n, true)
mm.metaTotal += n
mm.meta.freelist.AddRegion(reg)
})
if mm.maxPages == 0 && mm.data.endMarker < mm.meta.endMarker {
mm.data.endMarker = mm.meta.endMarker
}
return true
}
// Enough memory available in data area. Try to allocate continuous region first
reg := da.AllocContinuousRegion(st, count)
if reg.id != 0 {
mm.transferToMeta(st, reg)
return true
}
// no continuous memory block -> allocate single regions
n := da.AllocRegionsWith(st, count, func(reg region) {
mm.transferToMeta(st, reg)
})
return n == count
}