Index: src/mark-compact.cc |
diff --git a/src/mark-compact.cc b/src/mark-compact.cc |
index 9fa79ca74629a406ea6a27181bfa296c23f47cee..3f4d236a38a06b0205b11777d5b7709ca4f6eaa7 100644 |
--- a/src/mark-compact.cc |
+++ b/src/mark-compact.cc |
@@ -63,6 +63,7 @@ MarkCompactCollector::MarkCompactCollector() : // NOLINT |
compacting_(false), |
was_marked_incrementally_(false), |
collect_maps_(FLAG_collect_maps), |
+ markbits_are_tainted_(false), |
tracer_(NULL), |
migration_slots_buffer_(NULL), |
#ifdef DEBUG |
@@ -330,7 +331,7 @@ void MarkCompactCollector::VerifyMarkbitsAreClean() { |
#endif |
-static void ClearMarkbits(PagedSpace* space) { |
+static void ClearMarkbitsInPagedSpace(PagedSpace* space) { |
PageIterator it(space); |
while (it.has_next()) { |
@@ -339,7 +340,7 @@ static void ClearMarkbits(PagedSpace* space) { |
} |
-static void ClearMarkbits(NewSpace* space) { |
+static void ClearMarkbitsInNewSpace(NewSpace* space) { |
NewSpacePageIterator it(space->ToSpaceStart(), space->ToSpaceEnd()); |
while (it.has_next()) { |
@@ -348,20 +349,24 @@ static void ClearMarkbits(NewSpace* space) { |
} |
-static void ClearMarkbits(Heap* heap) { |
- ClearMarkbits(heap->code_space()); |
- ClearMarkbits(heap->map_space()); |
- ClearMarkbits(heap->old_pointer_space()); |
- ClearMarkbits(heap->old_data_space()); |
- ClearMarkbits(heap->cell_space()); |
- ClearMarkbits(heap->new_space()); |
+void MarkCompactCollector::ClearMarkbits() { |
+ if (!markbits_are_tainted_) return; |
- LargeObjectIterator it(heap->lo_space()); |
+ ClearMarkbitsInPagedSpace(heap()->code_space()); |
+ ClearMarkbitsInPagedSpace(heap()->map_space()); |
+ ClearMarkbitsInPagedSpace(heap()->old_pointer_space()); |
+ ClearMarkbitsInPagedSpace(heap()->old_data_space()); |
+ ClearMarkbitsInPagedSpace(heap()->cell_space()); |
+ ClearMarkbitsInNewSpace(heap()->new_space()); |
+ |
+ LargeObjectIterator it(heap()->lo_space()); |
for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) { |
MarkBit mark_bit = Marking::MarkBitFrom(obj); |
mark_bit.Clear(); |
mark_bit.Next().Clear(); |
} |
+ |
+ markbits_are_tainted_ = false; |
Erik Corry
2011/10/19 17:56:07
Here you could use SetMarkbitsTainted(false)
|
} |
@@ -504,9 +509,9 @@ void MarkCompactCollector::Prepare(GCTracer* tracer) { |
// Clear marking bits for precise sweeping to collect all garbage. |
if (was_marked_incrementally_ && PreciseSweepingRequired()) { |
heap()->incremental_marking()->Abort(); |
- ClearMarkbits(heap_); |
AbortCompaction(); |
was_marked_incrementally_ = false; |
+ TaintMarkbits(); |
} |
// Don't start compaction if we are in the middle of incremental |
@@ -515,6 +520,8 @@ void MarkCompactCollector::Prepare(GCTracer* tracer) { |
StartCompaction(); |
} |
+ ClearMarkbits(); |
+ |
PagedSpaces spaces; |
for (PagedSpace* space = spaces.next(); |
space != NULL; |