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

Unified Diff: src/incremental-marking.cc

Issue 7302003: Support slots recording for compaction during incremental marking. (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/gc
Patch Set: fix presubmit, remove last debug check Created 9 years, 5 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
« no previous file with comments | « src/incremental-marking.h ('k') | src/incremental-marking-inl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/incremental-marking.cc
diff --git a/src/incremental-marking.cc b/src/incremental-marking.cc
index 2cee9810d21227f48202d5056036ca6559e4f389..71096dc61836dc71a9a7b332c5b739d4d87fc55b 100644
--- a/src/incremental-marking.cc
+++ b/src/incremental-marking.cc
@@ -57,7 +57,20 @@ void IncrementalMarking::TearDown() {
void IncrementalMarking::RecordWriteFromCode(HeapObject* obj,
Object* value,
Isolate* isolate) {
- isolate->heap()->incremental_marking()->RecordWrite(obj, value);
+ ASSERT(obj->IsHeapObject());
+
+ IncrementalMarking* marking = isolate->heap()->incremental_marking();
+ ASSERT(!marking->is_compacting_);
+ marking->RecordWrite(obj, NULL, value);
+}
+
+
+void IncrementalMarking::RecordWriteForEvacuationFromCode(HeapObject* obj,
+ Object** slot,
+ Isolate* isolate) {
+ IncrementalMarking* marking = isolate->heap()->incremental_marking();
+ ASSERT(marking->is_compacting_);
+ marking->RecordWrite(obj, slot, *slot);
}
@@ -70,22 +83,24 @@ class IncrementalMarkingMarkingVisitor : public ObjectVisitor {
}
void VisitPointer(Object** p) {
- MarkObjectByPointer(p);
+ MarkObjectByPointer(p, p);
}
void VisitPointers(Object** start, Object** end) {
- for (Object** p = start; p < end; p++) MarkObjectByPointer(p);
+ for (Object** p = start; p < end; p++) MarkObjectByPointer(start, p);
}
private:
// Mark object pointed to by p.
- INLINE(void MarkObjectByPointer(Object** p)) {
+ INLINE(void MarkObjectByPointer(Object** anchor, Object** p)) {
Object* obj = *p;
// Since we can be sure that the object is not tagged as a failure we can
// inline a slightly more efficient tag check here than IsHeapObject() would
// produce.
if (obj->NonFailureIsHeapObject()) {
HeapObject* heap_object = HeapObject::cast(obj);
+
+ heap_->mark_compact_collector()->RecordSlot(anchor, p, obj);
MarkBit mark_bit = Marking::MarkBitFrom(heap_object);
if (mark_bit.data_only()) {
incremental_marking_->MarkBlackOrKeepGrey(mark_bit);
@@ -279,14 +294,14 @@ bool IncrementalMarking::WorthActivating() {
static const intptr_t kActivationThreshold = 0;
#endif
- // TODO(gc) ISOLATES MERGE
return FLAG_incremental_marking &&
heap_->PromotedSpaceSize() > kActivationThreshold;
}
-static void PatchIncrementalMarkingRecordWriteStubs(bool enable) {
- NumberDictionary* stubs = HEAP->code_stubs();
+static void PatchIncrementalMarkingRecordWriteStubs(
+ Heap* heap, RecordWriteStub::Mode mode) {
+ NumberDictionary* stubs = heap->code_stubs();
int capacity = stubs->Capacity();
for (int i = 0; i < capacity; i++) {
@@ -298,7 +313,7 @@ static void PatchIncrementalMarkingRecordWriteStubs(bool enable) {
CodeStub::RecordWrite) {
Object* e = stubs->ValueAt(i);
if (e->IsCode()) {
- RecordWriteStub::Patch(Code::cast(e), enable);
+ RecordWriteStub::Patch(Code::cast(e), mode);
}
}
}
@@ -345,9 +360,15 @@ void IncrementalMarking::StartMarking() {
PrintF("[IncrementalMarking] Start marking\n");
}
+ is_compacting_ = !FLAG_never_compact &&
+ heap_->mark_compact_collector()->StartCompaction();
+
state_ = MARKING;
- PatchIncrementalMarkingRecordWriteStubs(true);
+ RecordWriteStub::Mode mode = is_compacting_ ?
+ RecordWriteStub::INCREMENTAL_COMPACTION : RecordWriteStub::INCREMENTAL;
+
+ PatchIncrementalMarkingRecordWriteStubs(heap_, mode);
EnsureMarkingDequeIsCommitted();
@@ -398,6 +419,7 @@ void IncrementalMarking::UpdateMarkingDequeAfterScavenge() {
while (current != limit) {
HeapObject* obj = array[current];
+ ASSERT(obj->IsHeapObject());
current = ((current + 1) & mask);
if (heap_->InNewSpace(obj)) {
MapWord map_word = obj->map_word();
@@ -465,21 +487,25 @@ void IncrementalMarking::Abort() {
IncrementalMarking::set_should_hurry(false);
ResetStepCounters();
if (IsMarking()) {
- PatchIncrementalMarkingRecordWriteStubs(false);
+ PatchIncrementalMarkingRecordWriteStubs(heap_,
+ RecordWriteStub::STORE_BUFFER_ONLY);
DeactivateIncrementalWriteBarrier();
}
heap_->isolate()->stack_guard()->Continue(GC_REQUEST);
state_ = STOPPED;
+ is_compacting_ = false;
}
void IncrementalMarking::Finalize() {
Hurry();
state_ = STOPPED;
+ is_compacting_ = false;
heap_->new_space()->LowerInlineAllocationLimit(0);
IncrementalMarking::set_should_hurry(false);
ResetStepCounters();
- PatchIncrementalMarkingRecordWriteStubs(false);
+ PatchIncrementalMarkingRecordWriteStubs(heap_,
+ RecordWriteStub::STORE_BUFFER_ONLY);
DeactivateIncrementalWriteBarrier();
ASSERT(marking_deque_.IsEmpty());
heap_->isolate()->stack_guard()->Continue(GC_REQUEST);
@@ -497,8 +523,7 @@ void IncrementalMarking::MarkingComplete() {
if (FLAG_trace_incremental_marking) {
PrintF("[IncrementalMarking] Complete (normal).\n");
}
- // TODO(gc) ISOLATES
- ISOLATE->stack_guard()->RequestGC();
+ heap_->isolate()->stack_guard()->RequestGC();
}
« no previous file with comments | « src/incremental-marking.h ('k') | src/incremental-marking-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698