Index: src/heap/concurrent-marking.cc |
diff --git a/src/heap/concurrent-marking.cc b/src/heap/concurrent-marking.cc |
index 618cb1139b1b7db55090c85f77b83aaba779c9d9..2e91ae368f958edec45f6577b2fdfa2fc5d0c1c8 100644 |
--- a/src/heap/concurrent-marking.cc |
+++ b/src/heap/concurrent-marking.cc |
@@ -30,6 +30,11 @@ class ConcurrentMarkingVisitor final |
explicit ConcurrentMarkingVisitor(ConcurrentMarkingDeque* deque) |
: deque_(deque) {} |
+ bool ShouldVisit(HeapObject* object) override { |
+ return ObjectMarking::GreyToBlack<MarkBit::AccessMode::ATOMIC>( |
+ object, marking_state(object)); |
+ } |
+ |
void VisitPointers(HeapObject* host, Object** start, Object** end) override { |
for (Object** p = start; p < end; p++) { |
if (!(*p)->IsHeapObject()) continue; |
@@ -68,7 +73,7 @@ class ConcurrentMarkingVisitor final |
// =========================================================================== |
int VisitCode(Map* map, Code* object) override { |
- // TODO(ulan): push the object to the bail-out deque. |
+ deque_->Push(object, MarkingThread::kConcurrent, TargetDeque::kBailout); |
return 0; |
} |
@@ -77,58 +82,65 @@ class ConcurrentMarkingVisitor final |
// =========================================================================== |
int VisitBytecodeArray(Map* map, BytecodeArray* object) override { |
- // TODO(ulan): implement iteration of strong fields and push the object to |
- // the bailout deque. |
+ // TODO(ulan): implement iteration of strong fields. |
+ deque_->Push(object, MarkingThread::kConcurrent, TargetDeque::kBailout); |
return 0; |
} |
int VisitJSFunction(Map* map, JSFunction* object) override { |
- // TODO(ulan): implement iteration of strong fields and push the object to |
- // the bailout deque. |
+ // TODO(ulan): implement iteration of strong fields. |
+ deque_->Push(object, MarkingThread::kConcurrent, TargetDeque::kBailout); |
return 0; |
} |
int VisitMap(Map* map, Map* object) override { |
- // TODO(ulan): implement iteration of strong fields and push the object to |
- // the bailout deque. |
+ // TODO(ulan): implement iteration of strong fields. |
+ deque_->Push(object, MarkingThread::kConcurrent, TargetDeque::kBailout); |
return 0; |
} |
int VisitNativeContext(Map* map, Context* object) override { |
- // TODO(ulan): implement iteration of strong fields and push the object to |
- // the bailout deque. |
+ // TODO(ulan): implement iteration of strong fields. |
+ deque_->Push(object, MarkingThread::kConcurrent, TargetDeque::kBailout); |
return 0; |
} |
int VisitSharedFunctionInfo(Map* map, SharedFunctionInfo* object) override { |
- // TODO(ulan): implement iteration of strong fields and push the object to |
- // the bailout deque. |
+ // TODO(ulan): implement iteration of strong fields. |
+ deque_->Push(object, MarkingThread::kConcurrent, TargetDeque::kBailout); |
return 0; |
} |
int VisitTransitionArray(Map* map, TransitionArray* object) override { |
- // TODO(ulan): implement iteration of strong fields and push the object to |
- // the bailout deque. |
+ // TODO(ulan): implement iteration of strong fields. |
+ deque_->Push(object, MarkingThread::kConcurrent, TargetDeque::kBailout); |
return 0; |
} |
int VisitWeakCell(Map* map, WeakCell* object) override { |
- // TODO(ulan): implement iteration of strong fields and push the object to |
- // the bailout deque. |
+ // TODO(ulan): implement iteration of strong fields. |
+ deque_->Push(object, MarkingThread::kConcurrent, TargetDeque::kBailout); |
return 0; |
} |
int VisitJSWeakCollection(Map* map, JSWeakCollection* object) override { |
- // TODO(ulan): implement iteration of strong fields and push the object to |
- // the bailout deque. |
+ // TODO(ulan): implement iteration of strong fields. |
+ deque_->Push(object, MarkingThread::kConcurrent, TargetDeque::kBailout); |
return 0; |
} |
- void MarkObject(HeapObject* obj) { |
- deque_->Push(obj, MarkingThread::kConcurrent, TargetDeque::kShared); |
+ void MarkObject(HeapObject* object) { |
+ if (ObjectMarking::WhiteToGrey<MarkBit::AccessMode::ATOMIC>( |
+ object, marking_state(object))) { |
+ deque_->Push(object, MarkingThread::kConcurrent, TargetDeque::kShared); |
+ } |
} |
private: |
+ MarkingState marking_state(HeapObject* object) const { |
+ return MarkingState::Internal(object); |
+ } |
+ |
ConcurrentMarkingDeque* deque_; |
}; |
@@ -175,7 +187,7 @@ void ConcurrentMarking::Run() { |
TimedScope scope(&time_ms); |
HeapObject* object; |
while ((object = deque_->Pop(MarkingThread::kConcurrent)) != nullptr) { |
- bytes_marked += visitor_->IterateBody(object); |
+ bytes_marked += visitor_->Visit(object); |
} |
} |
if (FLAG_trace_concurrent_marking) { |