24 size_t memory_region_size,
size_t page_size)
25 : whole_region_(memory_region_begin, memory_region_size,
27 region_size_in_pages_(size() / page_size),
28 max_load_for_randomization_(
31 page_size_(page_size) {
63 DCHECK((*iter)->contains(address));
97 DCHECK(!region->is_excluded());
100 new Region(region->begin() + new_size, region->size() - new_size, state);
105 region->set_size(new_size);
117 AllRegionsSet::iterator next_iter) {
118 Region* prev = *prev_iter;
119 Region* next = *next_iter;
140 if (region->size() != size) {
149 return region->begin();
183 AllRegionsSet::iterator region_iter =
FindRegion(requested_address);
187 region = *region_iter;
189 if (!region->is_free() || region->end() < requested_end) {
193 if (region->begin() != requested_address) {
195 size_t new_size = requested_address - region->begin();
197 region =
Split(region, new_size);
199 if (region->end() != requested_end) {
203 DCHECK_EQ(region->begin(), requested_address);
208 region->set_state(region_state);
213 size_t size,
size_t alignment) {
218 const size_t padded_size = size + alignment -
page_size_;
220 if (region ==
nullptr) {
227 if (!
IsAligned(region->begin(), alignment)) {
229 if (
start + size > region->end()) {
232 region =
Split(region,
start - region->begin());
237 if (region->size() != size) {
246 return region->begin();
275 AllRegionsSet::iterator region_iter =
FindRegion(address);
279 Region* region = *region_iter;
280 if (region->begin() != address || !region->is_allocated()) {
288 region =
Split(region, new_size);
291 size_t size = region->size();
297 AllRegionsSet::iterator next_iter = std::next(region_iter);
299 if ((*next_iter)->is_free()) {
303 Merge(region_iter, next_iter);
306 if (new_size == 0 && region->begin() !=
whole_region_.begin()) {
308 AllRegionsSet::iterator prev_iter = std::prev(region_iter);
310 if ((*prev_iter)->is_free()) {
314 Merge(prev_iter, region_iter);
316 region_iter = prev_iter;
317 region = *region_iter;
325 AllRegionsSet::iterator region_iter =
FindRegion(address);
329 Region* region = *region_iter;
330 if (region->begin() != address || region->is_free()) {
333 return region->size();
338 AllRegionsSet::iterator region_iter =
FindRegion(address);
342 Region* region = *region_iter;
343 return region->is_free() && region->contains(address, size);
362 std::ios::fmtflags flags = os.flags(std::ios::hex | std::ios::showbase);
363 os <<
"[" <<
begin() <<
", " <<
end() <<
"), size: " <<
size();
364 os <<
", " << RegionStateToString(
state_);
369 std::ios::fmtflags flags = os.flags(std::ios::hex | std::ios::showbase);
370 os <<
"RegionAllocator: [" <<
begin() <<
", " <<
end() <<
")";
371 os <<
"\nsize: " <<
size();
375 os <<
"\nall regions: ";
381 os <<
"\nfree regions: ";
void set_size(size_t size)
void NextBytes(void *buffer, size_t buflen)
void Print(std::ostream &os) const
Region * FreeListFindRegion(size_t size)
RegionAllocator(Address address, size_t size, size_t page_size)
AllRegionsSet all_regions_
void FreeListRemoveRegion(Region *region)
void Print(std::ostream &os) const
Address AllocateRegion(size_t size)
const Region whole_region_
bool AllocateRegionAt(Address requested_address, size_t size, RegionState region_state=RegionState::kAllocated)
const size_t region_size_in_pages_
bool contains(Address address) const
const size_t max_load_for_randomization_
SplitMergeCallback on_split_
bool IsFree(Address address, size_t size)
size_t TrimRegion(Address address, size_t new_size)
void Merge(AllRegionsSet::iterator prev_iter, AllRegionsSet::iterator next_iter)
SplitMergeCallback on_merge_
Address AllocateAlignedRegion(size_t size, size_t alignment)
size_t CheckRegion(Address address)
static constexpr Address kAllocationFailure
Region * Split(Region *region, size_t new_size)
std::set< Region *, SizeAddressOrder > free_regions_
AllRegionsSet::iterator FindRegion(Address address)
void FreeListAddRegion(Region *region)
refactor address components for immediate indexing make OptimizeMaglevOnNextCall optimize to turbofan instead of maglev filter for tracing turbofan compilation nullptr
constexpr bool IsPowerOfTwo(T value)
constexpr int kMaxRandomizationAttempts
constexpr double kMaxLoadFactorForRandomization
#define DCHECK_LE(v1, v2)
#define CHECK_LT(lhs, rhs)
#define DCHECK_NE(v1, v2)
#define DCHECK_GE(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
#define DCHECK_GT(v1, v2)
constexpr T RoundUp(T x, intptr_t m)
constexpr bool IsAligned(T value, U alignment)
std::unique_ptr< ValueMirror > key