Index: src/heap/spaces.h |
diff --git a/src/heap/spaces.h b/src/heap/spaces.h |
index 6832458a16f05df9f78adb16580e0293e69ed471..c7866b64fbd3c95c7ee703206900b612e3326561 100644 |
--- a/src/heap/spaces.h |
+++ b/src/heap/spaces.h |
@@ -542,6 +542,10 @@ class MemoryChunk { |
return reinterpret_cast<MemoryChunk*>(OffsetFrom(a) & ~kAlignmentMask); |
} |
+ static intptr_t OffsetInPage(Address a) { |
+ return reinterpret_cast<intptr_t>(a) & kPageAlignmentMask; |
+ } |
+ |
static inline MemoryChunk* FromAnyPointerAddress(Heap* heap, Address addr); |
static inline void UpdateHighWaterMark(Address mark) { |
@@ -2582,6 +2586,7 @@ class NewSpace : public Space { |
from_space_(heap, kFromSpace), |
reservation_(), |
pages_used_(0), |
+ allocated_since_last_gc_(0), |
top_on_previous_step_(0), |
allocated_histogram_(nullptr), |
promoted_histogram_(nullptr) {} |
@@ -2653,42 +2658,7 @@ class NewSpace : public Space { |
// Return the available bytes without growing. |
intptr_t Available() override { return Capacity() - Size(); } |
- size_t AllocatedSinceLastGC() { |
- bool seen_age_mark = false; |
- Address age_mark = to_space_.age_mark(); |
- NewSpacePage* current_page = to_space_.first_page(); |
- NewSpacePage* age_mark_page = NewSpacePage::FromAddress(age_mark); |
- NewSpacePage* last_page = NewSpacePage::FromAddress(top() - kPointerSize); |
- if (age_mark_page == last_page) { |
- if (top() - age_mark >= 0) { |
- return top() - age_mark; |
- } |
- // Top was reset at some point, invalidating this metric. |
- return 0; |
- } |
- while (current_page != last_page) { |
- if (current_page == age_mark_page) { |
- seen_age_mark = true; |
- break; |
- } |
- current_page = current_page->next_page(); |
- } |
- if (!seen_age_mark) { |
- // Top was reset at some point, invalidating this metric. |
- return 0; |
- } |
- intptr_t allocated = age_mark_page->area_end() - age_mark; |
- DCHECK_EQ(current_page, age_mark_page); |
- current_page = age_mark_page->next_page(); |
- while (current_page != last_page) { |
- allocated += NewSpacePage::kAllocatableMemory; |
- current_page = current_page->next_page(); |
- } |
- allocated += top() - current_page->area_start(); |
- DCHECK_LE(0, allocated); |
- DCHECK_LE(allocated, Size()); |
- return static_cast<size_t>(allocated); |
- } |
+ inline size_t AllocatedSinceLastGC(); |
// Return the maximum capacity of a semispace. |
int MaximumCapacity() { |
@@ -2722,7 +2692,10 @@ class NewSpace : public Space { |
// Get the age mark of the inactive semispace. |
Address age_mark() { return from_space_.age_mark(); } |
// Set the age mark in the active semispace. |
- void set_age_mark(Address mark) { to_space_.set_age_mark(mark); } |
+ void set_age_mark(Address mark) { |
+ to_space_.set_age_mark(mark); |
+ allocated_since_last_gc_ = 0; |
+ } |
// The allocation top and limit address. |
Address* allocation_top_address() { return allocation_info_.top_address(); } |
@@ -2843,6 +2816,7 @@ class NewSpace : public Space { |
SemiSpace from_space_; |
base::VirtualMemory reservation_; |
int pages_used_; |
+ intptr_t allocated_since_last_gc_; |
// Allocation pointer and limit for normal allocation and allocation during |
// mark-compact collection. |