Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(53)

Unified Diff: src/incremental-marking.cc

Issue 6970004: Introduce lazy sweeping. (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/gc
Patch Set: Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/incremental-marking.cc
diff --git a/src/incremental-marking.cc b/src/incremental-marking.cc
index ad5a2416c24beb81c033ddcefe8ac6767c070219..f8a5fd7704cab76fd028687f128627d660a022c1 100644
--- a/src/incremental-marking.cc
+++ b/src/incremental-marking.cc
@@ -106,7 +106,6 @@ class IncrementalMarkingRootMarkingVisitor : public ObjectVisitor {
incremental_marking_(incremental_marking) {
}
-
void VisitPointer(Object** p) {
MarkObjectByPointer(p);
}
@@ -136,7 +135,7 @@ class IncrementalMarkingRootMarkingVisitor : public ObjectVisitor {
};
-static void ClearMarkbits(PagedSpace* space) {
+void IncrementalMarking::ClearMarkbits(PagedSpace* space) {
PageIterator it(space);
while (it.has_next()) {
@@ -146,37 +145,37 @@ static void ClearMarkbits(PagedSpace* space) {
}
-static void ClearMarkbits() {
+void IncrementalMarking::ClearMarkbits() {
// TODO(gc): Clear the mark bits in the sweeper.
- // TODO(gc) ISOLATES MERGE
- ClearMarkbits(HEAP->old_pointer_space());
- ClearMarkbits(HEAP->old_data_space());
- ClearMarkbits(HEAP->cell_space());
- ClearMarkbits(HEAP->map_space());
- ClearMarkbits(HEAP->code_space());
+ ClearMarkbits(heap_->old_pointer_space());
+ ClearMarkbits(heap_->old_data_space());
+ ClearMarkbits(heap_->cell_space());
+ ClearMarkbits(heap_->map_space());
+ ClearMarkbits(heap_->code_space());
Erik Corry 2011/05/09 21:20:11 Who clears the mark bits in the large object space
}
#ifdef DEBUG
- static void VerifyMarkbitsAreClean(PagedSpace* space) {
- PageIterator it(space);
+void IncrementalMarking::VerifyMarkbitsAreClean(PagedSpace* space) {
+ PageIterator it(space);
- while (it.has_next()) {
- Page* p = it.next();
- ASSERT(p->markbits()->IsClean());
- }
+ while (it.has_next()) {
+ Page* p = it.next();
+ ASSERT(p->markbits()->IsClean());
}
+}
- static void VerifyMarkbitsAreClean() {
- // TODO(gc) ISOLATES MERGE
- VerifyMarkbitsAreClean(HEAP->old_pointer_space());
- VerifyMarkbitsAreClean(HEAP->old_data_space());
- VerifyMarkbitsAreClean(HEAP->code_space());
- VerifyMarkbitsAreClean(HEAP->cell_space());
- VerifyMarkbitsAreClean(HEAP->map_space());
- }
+
+void IncrementalMarking::VerifyMarkbitsAreClean() {
+ VerifyMarkbitsAreClean(heap_->old_pointer_space());
+ VerifyMarkbitsAreClean(heap_->old_data_space());
+ VerifyMarkbitsAreClean(heap_->code_space());
+ VerifyMarkbitsAreClean(heap_->cell_space());
+ VerifyMarkbitsAreClean(heap_->map_space());
+}
#endif
+
bool IncrementalMarking::WorthActivating() {
#ifndef DEBUG
static const intptr_t kActivationThreshold = 8 * MB;
@@ -212,8 +211,10 @@ static void PatchIncrementalMarkingRecordWriteStubs(bool enable) {
}
}
+
static VirtualMemory* marking_deque_memory = NULL;
+
static void EnsureMarkingDequeIsCommitted() {
if (marking_deque_memory == NULL) {
marking_deque_memory = new VirtualMemory(4*MB);
@@ -231,10 +232,26 @@ void IncrementalMarking::Start() {
}
ASSERT(FLAG_incremental_marking);
ASSERT(state_ == STOPPED);
- state_ = MARKING;
ResetStepCounters();
+ if (heap_->old_pointer_space()->IsSweepingComplete() &&
+ heap_->old_data_space()->IsSweepingComplete()) {
+ StartMarking();
+ } else {
+ PrintF("[IncrementalMarking] Start sweeping.\n");
antonm 2011/05/10 13:09:38 if (FLAG_trace_incremental_marking)?
+ state_ = SWEEPING;
+ }
+}
+
+
+void IncrementalMarking::StartMarking() {
+ if (FLAG_trace_incremental_marking) {
+ PrintF("[IncrementalMarking] Start marking\n");
+ }
+
+ state_ = MARKING;
+
PatchIncrementalMarkingRecordWriteStubs(true);
EnsureMarkingDequeIsCommitted();
@@ -341,6 +358,17 @@ void IncrementalMarking::Hurry() {
}
+void IncrementalMarking::Abort() {
+ if (IsStopped()) return;
+ heap_->new_space()->LowerInlineAllocationLimit(0);
+ IncrementalMarking::set_should_hurry(false);
+ ResetStepCounters();
+ if (IsMarking()) PatchIncrementalMarkingRecordWriteStubs(false);
+ heap_->isolate()->stack_guard()->Continue(GC_REQUEST);
+ state_ = STOPPED;
+}
+
+
void IncrementalMarking::Finalize() {
Hurry();
state_ = STOPPED;
@@ -349,7 +377,7 @@ void IncrementalMarking::Finalize() {
ResetStepCounters();
PatchIncrementalMarkingRecordWriteStubs(false);
ASSERT(marking_deque_.IsEmpty());
- ISOLATE->stack_guard()->Continue(GC_REQUEST);
+ heap_->isolate()->stack_guard()->Continue(GC_REQUEST);
}
@@ -370,60 +398,66 @@ void IncrementalMarking::MarkingComplete() {
void IncrementalMarking::Step(intptr_t allocated_bytes) {
- if (state_ == MARKING &&
- heap_->gc_state() == Heap::NOT_IN_GC &&
- FLAG_incremental_marking_steps) {
- allocated_ += allocated_bytes;
+ if (heap_->gc_state() != Heap::NOT_IN_GC) return;
+ if (!FLAG_incremental_marking_steps) return;
- if (allocated_ >= kAllocatedThreshold) {
- double start = 0;
+ allocated_ += allocated_bytes;
- if (FLAG_trace_incremental_marking || FLAG_trace_gc) {
- start = OS::TimeCurrentMillis();
- }
+ if (allocated_ < kAllocatedThreshold) return;
- intptr_t bytes_to_process = allocated_ * allocation_marking_factor_;
- int count = 0;
-
- Map* filler_map = heap_->one_pointer_filler_map();
- IncrementalMarkingMarkingVisitor marking_visitor(heap_, this);
- Marking* marking = heap_->marking();
- while (!marking_deque_.IsEmpty() && bytes_to_process > 0) {
- HeapObject* obj = marking_deque_.Pop();
-
- // Explicitly skip one word fillers. Incremental markbit patterns are
- // correct only for objects that occupy at least two words.
- Map* map = obj->map();
- if (map != filler_map) {
- ASSERT(IsGrey(marking->MarkBitFrom(obj)));
- int size = obj->SizeFromMap(map);
- bytes_to_process -= size;
- MarkBit map_mark_bit = marking->MarkBitFromOldSpace(map);
- if (IsWhite(map_mark_bit)) WhiteToGreyAndPush(map, map_mark_bit);
- // TODO(gc) switch to static visitor instead of normal visitor.
- obj->IterateBody(map->instance_type(), size, &marking_visitor);
- MarkBit obj_mark_bit = marking->MarkBitFrom(obj);
- MarkBlack(obj_mark_bit);
- }
- count++;
- }
- allocated_ = 0;
- if (marking_deque_.IsEmpty()) MarkingComplete();
- if (FLAG_trace_incremental_marking || FLAG_trace_gc) {
- double end = OS::TimeCurrentMillis();
- steps_took_ += (end - start);
- }
+ intptr_t bytes_to_process = allocated_ * allocation_marking_factor_;
- steps_count_++;
+ double start = 0;
- if ((steps_count_ % kAllocationMarkingFactorSpeedupInterval) == 0) {
- allocation_marking_factor_ += kAllocationMarkingFactorSpeedup;
- allocation_marking_factor_ *= 1.3;
- if (FLAG_trace_gc) {
- PrintF("Marking speed increased to %d\n", allocation_marking_factor_);
- }
+ if (FLAG_trace_incremental_marking || FLAG_trace_gc) {
+ start = OS::TimeCurrentMillis();
+ }
+
+ if (state_ == SWEEPING) {
+ if (heap_->old_pointer_space()->AdvanceSweeper(bytes_to_process) &&
+ heap_->old_data_space()->AdvanceSweeper(bytes_to_process)) {
+ StartMarking();
+ }
+ } else if (state_ == MARKING) {
+ Map* filler_map = heap_->one_pointer_filler_map();
+ IncrementalMarkingMarkingVisitor marking_visitor(heap_, this);
+ Marking* marking = heap_->marking();
+ while (!marking_deque_.IsEmpty() && bytes_to_process > 0) {
+ HeapObject* obj = marking_deque_.Pop();
+
+ // Explicitly skip one word fillers. Incremental markbit patterns are
+ // correct only for objects that occupy at least two words.
+ Map* map = obj->map();
+ if (map != filler_map) {
+ ASSERT(IsGrey(marking->MarkBitFrom(obj)));
+ int size = obj->SizeFromMap(map);
+ bytes_to_process -= size;
+ MarkBit map_mark_bit = marking->MarkBitFromOldSpace(map);
+ if (IsWhite(map_mark_bit)) WhiteToGreyAndPush(map, map_mark_bit);
+ // TODO(gc) switch to static visitor instead of normal visitor.
+ obj->IterateBody(map->instance_type(), size, &marking_visitor);
+ MarkBit obj_mark_bit = marking->MarkBitFrom(obj);
+ MarkBlack(obj_mark_bit);
}
}
+ if (marking_deque_.IsEmpty()) MarkingComplete();
+ }
+
+ allocated_ = 0;
+
+ steps_count_++;
+
+ if ((steps_count_ % kAllocationMarkingFactorSpeedupInterval) == 0) {
+ allocation_marking_factor_ += kAllocationMarkingFactorSpeedup;
+ allocation_marking_factor_ *= 1.3;
+ if (FLAG_trace_gc) {
+ PrintF("Marking speed increased to %d\n", allocation_marking_factor_);
+ }
+ }
+
+ if (FLAG_trace_incremental_marking || FLAG_trace_gc) {
+ double end = OS::TimeCurrentMillis();
+ steps_took_ += (end - start);
}
}
« no previous file with comments | « src/incremental-marking.h ('k') | src/incremental-marking-inl.h » ('j') | src/mark-compact.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698