Lines Matching refs:region
5 #include "src/base/region-allocator.h"
15 // to randomize region allocation.
35 // Initial region.
36 Region* region = new Region(whole_region_);
38 all_regions_.insert(region);
40 FreeListAddRegion(region);
45 // been freed again (and thus merged into a single region) or do that now.
46 for (Region* region : all_regions_) {
47 delete region;
59 // find the region whose |end()| is greater than the requested address.
65 void RegionAllocator::FreeListAddRegion(Region* region) {
66 free_size_ += region->size();
67 free_regions_.insert(region);
76 void RegionAllocator::FreeListRemoveRegion(Region* region) {
77 DCHECK(region->is_free());
78 auto iter = free_regions_.find(region);
80 DCHECK_EQ(region, *iter);
81 DCHECK_LE(region->size(), free_size_);
82 free_size_ -= region->size();
86 RegionAllocator::Region* RegionAllocator::Split(Region* region,
90 DCHECK_GT(region->size(), new_size);
92 if (on_split_) on_split_(region->begin(), new_size);
94 // Create new region and put it to the lists after the |region|.
95 DCHECK(!region->is_excluded());
96 RegionState state = region->state();
98 new Region(region->begin() + new_size, region->size() - new_size, state);
100 // Remove region from the free list before updating it's size.
101 FreeListRemoveRegion(region);
103 region->set_size(new_size);
108 FreeListAddRegion(region);
126 // The |next| region must already not be in the free list.
135 Region* region = FreeListFindRegion(size);
136 if (region == nullptr) return kAllocationFailure;
138 if (region->size() != size) {
139 Split(region, size);
141 DCHECK(IsAligned(region->begin(), page_size_));
142 DCHECK_EQ(region->size(), size);
144 // Mark region as used.
145 FreeListRemoveRegion(region);
146 region->set_state(RegionState::kAllocated);
147 return region->begin();
179 Region* region;
185 region = *region_iter;
187 if (!region->is_free() || region->end() < requested_end) {
190 // Found free region that includes the requested one.
191 if (region->begin() != requested_address) {
192 // Split the region at the |requested_address| boundary.
193 size_t new_size = requested_address - region->begin();
195 region = Split(region, new_size);
197 if (region->end() != requested_end) {
198 // Split the region at the |requested_end| boundary.
199 Split(region, size);
201 DCHECK_EQ(region->begin(), requested_address);
202 DCHECK_EQ(region->size(), size);
204 // Mark region as used.
205 FreeListRemoveRegion(region);
206 region->set_state(region_state);
217 Region* region = FreeListFindRegion(padded_size);
218 if (region == nullptr) return kAllocationFailure;
220 if (!IsAligned(region->begin(), alignment)) {
221 size_t start = RoundUp(region->begin(), alignment);
222 region = Split(region, start - region->begin());
223 DCHECK_EQ(region->begin(), start);
224 DCHECK(IsAligned(region->begin(), alignment));
227 if (region->size() != size) {
228 Split(region, size);
230 DCHECK(IsAligned(region->begin(), alignment));
231 DCHECK_EQ(region->size(), size);
233 // Mark region as used.
234 FreeListRemoveRegion(region);
235 region->set_state(RegionState::kAllocated);
236 return region->begin();
269 Region* region = *region_iter;
270 if (region->begin() != address || !region->is_allocated()) {
274 // The region must not be in the free list.
278 region = Split(region, new_size);
281 size_t size = region->size();
282 region->set_state(RegionState::kFree);
284 // Merge current region with the surrounding ones if they are free.
285 if (region->end() != whole_region_.end()) {
290 // |next| region object will be deleted during merge, remove it from
296 if (new_size == 0 && region->begin() != whole_region_.begin()) {
301 // |prev| region's size will change, we'll have to re-insert it into
305 // |prev| region becomes the current region.
307 region = *region_iter;
310 FreeListAddRegion(region);
319 Region* region = *region_iter;
320 if (region->begin() != address || region->is_free()) {
323 return region->size();
332 Region* region = *region_iter;
333 return region->is_free() && region->contains(address, size);
366 for (const Region* region : all_regions_) {
368 region->Print(os);
372 for (const Region* region : free_regions_) {
374 region->Print(os);