Index: src/heap/spaces.h |
diff --git a/src/heap/spaces.h b/src/heap/spaces.h |
index e233b328511601a46e9a6815763997175cdd9aa1..9289f9d060d3a083520042bac52a3237df3b388e 100644 |
--- a/src/heap/spaces.h |
+++ b/src/heap/spaces.h |
@@ -203,6 +203,8 @@ class Bitmap { |
static inline void Clear(MemoryChunk* chunk); |
+ static inline void SetAllBits(MemoryChunk* chunk); |
+ |
static void PrintWord(uint32_t word, uint32_t himask = 0) { |
for (uint32_t mask = 1; mask != 0; mask <<= 1) { |
if ((mask & himask) != 0) PrintF("["); |
@@ -314,6 +316,11 @@ class MemoryChunk { |
// to grey transition is performed in the value. |
HAS_PROGRESS_BAR, |
+ // A black page has all mark bits set to 1 (black). A black page currently |
+ // cannot be iterated because it is not swept. Moreover live bytes are also |
+ // not updated. |
+ BLACK_PAGE, |
+ |
// This flag is intended to be used for testing. Works only when both |
// FLAG_stress_compaction and FLAG_manual_evacuation_candidates_selection |
// are set. It forces the page to become an evacuation candidate at next |
@@ -573,6 +580,7 @@ class MemoryChunk { |
} |
void IncrementLiveBytes(int by) { |
+ if (IsFlagSet(BLACK_PAGE)) return; |
if (FLAG_gc_verbose) { |
printf("UpdateLiveBytes:%p:%x%c=%x->%x\n", static_cast<void*>(this), |
live_byte_count_, ((by < 0) ? '-' : '+'), ((by < 0) ? -by : by), |
@@ -585,10 +593,12 @@ class MemoryChunk { |
int LiveBytes() { |
DCHECK_LE(static_cast<unsigned>(live_byte_count_), size_); |
+ DCHECK(!IsFlagSet(BLACK_PAGE) || live_byte_count_ == 0); |
return live_byte_count_; |
} |
void SetLiveBytes(int live_bytes) { |
+ if (IsFlagSet(BLACK_PAGE)) return; |
DCHECK_GE(live_bytes, 0); |
DCHECK_LE(static_cast<unsigned>(live_bytes), size_); |
live_byte_count_ = live_bytes; |
@@ -2181,6 +2191,7 @@ class PagedSpace : public Space { |
// Mutex guarding any concurrent access to the space. |
base::Mutex space_mutex_; |
+ friend class IncrementalMarking; |
friend class MarkCompactCollector; |
friend class PageIterator; |