5#ifndef V8_HEAP_MAIN_ALLOCATOR_H_
6#define V8_HEAP_MAIN_ALLOCATOR_H_
25class SemiSpaceNewSpace;
26class SpaceWithLinearArea;
83 bool ContributeToSweeping(
84 uint32_t max_pages =
std::numeric_limits<uint32_t>::max());
86 bool TryAllocationFromFreeList(
size_t size_in_bytes,
AllocationOrigin origin);
113 bool WaitForSweepingForAllocation(
int size_in_bytes,
AllocationOrigin origin);
122 return original_top_.load(std::memory_order_acquire);
125 return original_limit_.load(std::memory_order_relaxed);
129 original_top_.store(top, std::memory_order_release);
132 original_limit_.store(limit, std::memory_order_relaxed);
141 std::atomic<Address> original_top_ = 0;
142 std::atomic<Address> original_limit_ = 0;
160 IsNewGeneration is_new_generation,
168 Address
start()
const {
return allocation_info_->start(); }
169 Address
top()
const {
return allocation_info_->top(); }
170 Address
limit()
const {
return allocation_info_->limit(); }
174 return allocation_info_->top_address();
179 return allocation_info_->limit_address();
183 return linear_area_original_data().get_original_top_acquire();
187 return linear_area_original_data().get_original_limit_relaxed();
190 void MoveOriginalTopForward();
192 Address extended_end);
198 return *allocation_info_;
202 return allocation_counter_.value();
206 return allocation_counter_.value();
214 AllocateRawForceAlignmentForTesting(
int size_in_bytes,
220 void PauseAllocationObservers();
221 void ResumeAllocationObservers();
225 size_t size_in_bytes,
226 size_t aligned_size_in_bytes,
227 size_t allocation_size);
238 V8_INLINE bool TryFreeLast(Address object_address,
int object_size);
245 Address ComputeLimit(Address
start, Address
end,
size_t min_size)
const;
253 return allocation_info_->top() != kNullAddress;
258 void ExtendLAB(Address limit);
271 static constexpr BlackAllocation ComputeBlackAllocation(IsNewGeneration);
283 AllocateFastAligned(
int size_in_bytes,
int* result_aligned_size_in_bytes,
305 void MarkLabStartInitialized();
307 bool IsBlackAllocationEnabled()
const;
310 return linear_area_original_data_.value();
314 return linear_area_original_data_.value();
317 int ObjectAlignment()
const;
322 return allocation_counter_.has_value();
326 return linear_area_original_data_.has_value();
330 bool in_gc()
const {
return local_heap_ ==
nullptr; }
336 bool in_gc_for_space()
const;
Heap * space_heap() const
virtual bool SupportsExtendingLAB() const
virtual void FreeLinearAllocationArea()=0
AllocatorPolicy(MainAllocator *allocator)
Heap * isolate_heap() const
virtual ~AllocatorPolicy()=default
MainAllocator *const allocator_
virtual bool EnsureAllocation(int size_in_bytes, AllocationAlignment alignment, AllocationOrigin origin)=0
void set_original_top_release(Address top)
base::Mutex * linear_area_lock()
Address get_original_top_acquire() const
void set_original_limit_relaxed(Address limit)
Address get_original_limit_relaxed() const
base::Mutex linear_area_lock_
std::optional< LinearAreaOriginalData > linear_area_original_data_
Address original_top_acquire() const
SpaceWithLinearArea *const space_
LocalHeap *const local_heap_
bool SupportsPendingAllocation() const
const LinearAllocationArea & allocation_info() const
Address * allocation_limit_address() const
bool supports_extending_lab() const
LocalHeap * local_heap() const
bool SupportsAllocationObserver() const
LinearAllocationArea & allocation_info()
AllocationCounter & allocation_counter()
std::optional< AllocationCounter > allocation_counter_
const LinearAreaOriginalData & linear_area_original_data() const
Heap *const isolate_heap_
Heap * isolate_heap() const
const bool supports_extending_lab_
V8_INLINE bool IsLabValid() const
LinearAreaOriginalData & linear_area_original_data()
std::unique_ptr< AllocatorPolicy > allocator_policy_
const BlackAllocation black_allocation_
Address * allocation_top_address() const
Address original_limit_relaxed() const
const AllocationCounter & allocation_counter() const
LinearAllocationArea owned_allocation_info_
LinearAllocationArea *const allocation_info_
bool SupportsExtendingLAB() const final
PagedNewSpace *const space_
std::unique_ptr< PagedSpaceAllocatorPolicy > paged_space_allocator_policy_
PagedSpaceAllocatorPolicy(PagedSpaceBase *space, MainAllocator *allocator)
void FreeLinearAllocationArea() final
SemiSpaceNewSpace *const space_
bool EnsureAllocation(int size_in_bytes, AllocationAlignment alignment, AllocationOrigin origin) final
void FreeLinearAllocationAreaUnsynchronized()
SemiSpaceNewSpaceAllocatorPolicy(SemiSpaceNewSpace *space, MainAllocator *allocator)
static constexpr int kLabSizeInGC
#define V8_EXPORT_PRIVATE
#define V8_WARN_UNUSED_RESULT