5#ifndef RUNTIME_VM_HEAP_PAGE_H_
6#define RUNTIME_VM_HEAP_PAGE_H_
19class ObjectPointerVisitor;
21class UnwindingRecords;
103 if (owner_ !=
nullptr)
return owner_->
top();
142 ASSERT(obj->IsHeapObject());
168#if defined(DART_COMPRESSED_POINTERS)
193 ASSERT(owner_ ==
nullptr);
204 uword old_top = top_;
206 top_.
store(new_top, std::memory_order_release);
210#if !defined(PRODUCT) || defined(FORCE_INCLUDE_SAMPLING_HEAP_PROFILER)
213 ASSERT(new_top >= old_top);
214 return new_top - old_top;
217 if (owner_ !=
nullptr) {
223 ASSERT(owner_ ==
nullptr);
226 if (
LIKELY(new_top <= end_)) {
234 ASSERT((addr + size) == top_);
237 uword* cursor =
reinterpret_cast<uword*
>(addr);
239 while (cursor <
end) {
253 if (card_table_ ==
nullptr) {
255 size_t size_in_bytes =
258 reinterpret_cast<uword*
>(
calloc(size_in_bytes,
sizeof(uint8_t)));
260 intptr_t
offset = slot -
reinterpret_cast<uword>(
this);
265 uword bit_mask =
static_cast<uword>(1) << bit_offset;
266 card_table_[word_offset] |= bit_mask;
270 if (card_table_ ==
nullptr) {
273 intptr_t
offset = slot -
reinterpret_cast<uword>(
this);
278 uword bit_mask =
static_cast<uword>(1) << bit_offset;
279 return (card_table_[word_offset] & bit_mask) != 0;
282 void set_object_end(
uword value) {
288 static Page* Allocate(intptr_t size,
uword flags);
295 VirtualMemory* memory_;
297 ForwardingPage* forwarding_page_;
299 RelaxedAtomic<intptr_t> progress_bar_;
307 RelaxedAtomic<uword> top_;
310 RelaxedAtomic<uword> end_;
void HandleReleasedTLAB(Thread *thread)
uword TryAllocateGC(intptr_t size)
static constexpr intptr_t kBytesPerCardLog2
bool Contains(uword addr) const
static intptr_t CachedSize()
uword object_start() const
bool IsCardRemembered(ObjectPtr const *slot)
uword promo_candidate_words() const
void AllocateForwardingPage()
ForwardingPage * forwarding_page() const
void set_next(Page *next)
static intptr_t card_table_offset()
static constexpr intptr_t OldObjectStartOffset()
intptr_t card_table_size() const
static Page * Of(uword addr)
static Page * Of(ObjectPtr obj)
bool IsSurvivor(uword raw_addr) const
uword original_top() const
static constexpr intptr_t NewObjectStartOffset()
uword original_end() const
void VisitObjects(ObjectVisitor *visitor) const
void RememberCard(ObjectPtr const *slot)
void Acquire(Thread *thread)
void UnregisterUnwindingRecords()
void VisitObjectsUnsafe(ObjectVisitor *visitor) const
static intptr_t original_top_offset()
uword new_object_start() const
void WriteProtect(bool read_only)
void VisitObjectPointers(ObjectPointerVisitor *visitor) const
bool is_executable() const
static intptr_t original_end_offset()
bool is_evacuation_candidate() const
void Unallocate(uword addr, intptr_t size)
bool is_vm_isolate() const
void VisitRememberedCards(ObjectPointerVisitor *visitor)
uword old_object_start() const
static constexpr intptr_t kSlotsPerCardLog2
void RegisterUnwindingRecords()
intptr_t Release(Thread *thread)
T load(std::memory_order order=std::memory_order_relaxed) const
void store(T arg, std::memory_order order=std::memory_order_relaxed)
static Thread * Current()
void set_true_end(uword true_end)
HeapProfileSampler & heap_sampler()
static constexpr T RoundUp(T x, uintptr_t alignment, uintptr_t offset=0)
bool Contains(uword addr) const
FlutterSemanticsFlag flags
constexpr intptr_t kBitsPerWordLog2
constexpr intptr_t kBitsPerByteLog2
static constexpr intptr_t kOldObjectAlignmentOffset
static constexpr intptr_t kObjectStartAlignment
static constexpr intptr_t kNewObjectAlignmentOffset
static constexpr intptr_t kCompressedWordSizeLog2
static constexpr intptr_t kPageSizeInWords
constexpr intptr_t kBitsPerWord
static constexpr intptr_t kAllocationCanary
static constexpr intptr_t kPageSize
static constexpr intptr_t kBlockSize
static constexpr intptr_t kBitVectorWordsPerBlock
static constexpr intptr_t kBlockMask
static constexpr intptr_t kObjectAlignmentMask
void * calloc(size_t n, size_t size)
static constexpr intptr_t kAllocationRedZoneSize
constexpr intptr_t kWordSize
static constexpr intptr_t kPageMask
static constexpr intptr_t kObjectAlignment
static constexpr intptr_t kBlocksPerPage
ObjectPtr CompressedObjectPtr
#define OFFSET_OF(type, field)