func()

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
}