Index: src/heap/mark-compact.cc |
diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc |
index 3d93c7ccc6dcb7d9175cfca258587a14b7a4847f..d0d92eb673bac51e6ed7759cf359a9d244a12f7c 100644 |
--- a/src/heap/mark-compact.cc |
+++ b/src/heap/mark-compact.cc |
@@ -723,6 +723,7 @@ void MarkCompactCollector::CollectEvacuationCandidates(PagedSpace* space) { |
int count = 0; |
int fragmentation = 0; |
+ int page_number = 0; |
Candidate* least = NULL; |
PageIterator it(space); |
@@ -737,9 +738,16 @@ void MarkCompactCollector::CollectEvacuationCandidates(PagedSpace* space) { |
CHECK(p->slots_buffer() == NULL); |
if (FLAG_stress_compaction) { |
- unsigned int counter = space->heap()->ms_count(); |
- uintptr_t page_number = reinterpret_cast<uintptr_t>(p) >> kPageSizeBits; |
- if ((counter & 1) == (page_number & 1)) fragmentation = 1; |
+ if (FLAG_manual_evacuation_candidates_selection) { |
+ if (p->IsFlagSet(MemoryChunk::FORCE_EVACUATION_CANDIDATE_FOR_TESTING)) { |
+ p->ClearFlag(MemoryChunk::FORCE_EVACUATION_CANDIDATE_FOR_TESTING); |
+ fragmentation = 1; |
+ } |
+ } else { |
+ unsigned int counter = space->heap()->ms_count(); |
+ if ((counter & 1) == (page_number & 1)) fragmentation = 1; |
+ page_number++; |
+ } |
} else if (mode == REDUCE_MEMORY_FOOTPRINT && !FLAG_always_compact) { |
// Don't try to release too many pages. |
if (estimated_release >= over_reserved) { |