Index: runtime/vm/gc_marker.cc |
diff --git a/runtime/vm/gc_marker.cc b/runtime/vm/gc_marker.cc |
index 2e63be3f122678823060f7eda1cf40eaf7d3c8cd..45e84d25fad6cbfde8a4ce603f56865a5cdd0607 100644 |
--- a/runtime/vm/gc_marker.cc |
+++ b/runtime/vm/gc_marker.cc |
@@ -499,12 +499,10 @@ void GCMarker::Epilogue(Isolate* isolate, bool invoke_api_callbacks) { |
void GCMarker::IterateRoots(Isolate* isolate, |
ObjectPointerVisitor* visitor, |
- bool visit_prologue_weak_persistent_handles, |
intptr_t slice_index, intptr_t num_slices) { |
ASSERT(0 <= slice_index && slice_index < num_slices); |
if ((slice_index == 0) || (num_slices <= 1)) { |
isolate->VisitObjectPointers(visitor, |
- visit_prologue_weak_persistent_handles, |
StackFrameIterator::kDontValidateFrames); |
} |
if ((slice_index == 1) || (num_slices <= 1)) { |
@@ -516,73 +514,10 @@ void GCMarker::IterateRoots(Isolate* isolate, |
} |
-void GCMarker::IterateWeakRoots(Isolate* isolate, |
- HandleVisitor* visitor, |
- bool visit_prologue_weak_persistent_handles) { |
+void GCMarker::IterateWeakRoots(Isolate* isolate, HandleVisitor* visitor) { |
ApiState* state = isolate->api_state(); |
ASSERT(state != NULL); |
- isolate->VisitWeakPersistentHandles(visitor, |
- visit_prologue_weak_persistent_handles); |
-} |
- |
- |
-template<class MarkingVisitorType> |
-void GCMarker::IterateWeakReferences(Isolate* isolate, |
- MarkingVisitorType* visitor) { |
- ApiState* state = isolate->api_state(); |
- ASSERT(state != NULL); |
- while (true) { |
- WeakReferenceSet* queue = state->delayed_weak_reference_sets(); |
- if (queue == NULL) { |
- // The delay queue is empty therefore no clean-up is required. |
- return; |
- } |
- state->set_delayed_weak_reference_sets(NULL); |
- while (queue != NULL) { |
- WeakReferenceSet* reference_set = WeakReferenceSet::Pop(&queue); |
- ASSERT(reference_set != NULL); |
- intptr_t num_keys = reference_set->num_keys(); |
- intptr_t num_values = reference_set->num_values(); |
- if ((num_keys == 1) && (num_values == 1) && |
- reference_set->SingletonKeyEqualsValue()) { |
- // We do not have to process sets that have just one key/value pair |
- // and the key and value are identical. |
- continue; |
- } |
- bool is_unreachable = true; |
- // Test each key object for reachability. If a key object is |
- // reachable, all value objects should be marked. |
- for (intptr_t k = 0; k < num_keys; ++k) { |
- if (!IsUnreachable(*reference_set->get_key(k))) { |
- for (intptr_t v = 0; v < num_values; ++v) { |
- visitor->VisitPointer(reference_set->get_value(v)); |
- } |
- is_unreachable = false; |
- // Since we have found a key object that is reachable and all |
- // value objects have been marked we can break out of iterating |
- // this set and move on to the next set. |
- break; |
- } |
- } |
- // If all key objects are unreachable put the reference on a |
- // delay queue. This reference will be revisited if another |
- // reference is marked. |
- if (is_unreachable) { |
- state->DelayWeakReferenceSet(reference_set); |
- } |
- } |
- if (!visitor->DrainMarkingStack()) { |
- // Break out of the loop if there has been no forward process. |
- // All key objects in the weak reference sets are unreachable |
- // so we reset the weak reference sets queue. |
- state->set_delayed_weak_reference_sets(NULL); |
- break; |
- } |
- } |
- ASSERT(state->delayed_weak_reference_sets() == NULL); |
- // All weak reference sets are zone allocated and unmarked references which |
- // were on the delay queue will be freed when the zone is released in the |
- // epilog callback. |
+ isolate->VisitWeakPersistentHandles(visitor); |
} |
@@ -643,7 +578,6 @@ class MarkTask : public ThreadPool::Task { |
DelaySet* delay_set, |
ThreadBarrier* barrier, |
bool collect_code, |
- bool visit_prologue_weak_persistent_handles, |
intptr_t task_index, |
intptr_t num_tasks, |
uintptr_t* num_busy) |
@@ -655,8 +589,6 @@ class MarkTask : public ThreadPool::Task { |
delay_set_(delay_set), |
barrier_(barrier), |
collect_code_(collect_code), |
- visit_prologue_weak_persistent_handles_( |
- visit_prologue_weak_persistent_handles), |
task_index_(task_index), |
num_tasks_(num_tasks), |
num_busy_(num_busy) { |
@@ -672,9 +604,7 @@ class MarkTask : public ThreadPool::Task { |
SyncMarkingVisitor visitor(isolate_, heap_, page_space_, marking_stack_, |
delay_set_, skipped_code_functions); |
// Phase 1: Iterate over roots and drain marking stack in tasks. |
- marker_->IterateRoots(isolate_, &visitor, |
- visit_prologue_weak_persistent_handles_, |
- task_index_, num_tasks_); |
+ marker_->IterateRoots(isolate_, &visitor, task_index_, num_tasks_); |
do { |
visitor.DrainMarkingStack(); |
@@ -723,7 +653,6 @@ class MarkTask : public ThreadPool::Task { |
DelaySet* delay_set_; |
ThreadBarrier* barrier_; |
bool collect_code_; |
- bool visit_prologue_weak_persistent_handles_; |
const intptr_t task_index_; |
const intptr_t num_tasks_; |
uintptr_t* num_busy_; |
@@ -764,7 +693,6 @@ void GCMarker::MarkObjects(Isolate* isolate, |
Zone* zone = stack_zone.GetZone(); |
MarkingStack marking_stack; |
DelaySet delay_set; |
- const bool visit_prologue_weak_persistent_handles = !invoke_api_callbacks; |
marked_bytes_ = 0; |
const int num_tasks = FLAG_marker_tasks; |
if (num_tasks == 0) { |
@@ -773,13 +701,10 @@ void GCMarker::MarkObjects(Isolate* isolate, |
collect_code ? new(zone) SkippedCodeFunctions() : NULL; |
UnsyncMarkingVisitor mark(isolate, heap_, page_space, &marking_stack, |
&delay_set, skipped_code_functions); |
- IterateRoots(isolate, &mark, visit_prologue_weak_persistent_handles, |
- 0, 1); |
+ IterateRoots(isolate, &mark, 0, 1); |
mark.DrainMarkingStack(); |
- IterateWeakReferences(isolate, &mark); |
MarkingWeakVisitor mark_weak; |
- IterateWeakRoots(isolate, &mark_weak, |
- !visit_prologue_weak_persistent_handles); |
+ IterateWeakRoots(isolate, &mark_weak); |
// All marking done; detach code, etc. |
FinalizeResultsFrom(&mark); |
} else { |
@@ -791,7 +716,6 @@ void GCMarker::MarkObjects(Isolate* isolate, |
MarkTask* mark_task = |
new MarkTask(this, isolate, heap_, page_space, &marking_stack, |
&delay_set, &barrier, collect_code, |
- visit_prologue_weak_persistent_handles, |
i, num_tasks, &num_busy); |
ThreadPool* pool = Dart::thread_pool(); |
pool->Run(mark_task); |
@@ -803,10 +727,8 @@ void GCMarker::MarkObjects(Isolate* isolate, |
collect_code ? new(zone) SkippedCodeFunctions() : NULL; |
SyncMarkingVisitor mark(isolate, heap_, page_space, &marking_stack, |
&delay_set, skipped_code_functions); |
- IterateWeakReferences(isolate, &mark); |
MarkingWeakVisitor mark_weak; |
- IterateWeakRoots(isolate, &mark_weak, |
- !visit_prologue_weak_persistent_handles); |
+ IterateWeakRoots(isolate, &mark_weak); |
barrier.Sync(); |
// Phase 3: Finalize results from all markers (detach code, etc.). |