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

Unified Diff: runtime/vm/gc_marker.cc

Issue 1459173004: Remove support for object grouping during Garbage Collection (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: code-review Created 5 years, 1 month 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 | « runtime/vm/gc_marker.h ('k') | runtime/vm/isolate.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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.).
« no previous file with comments | « runtime/vm/gc_marker.h ('k') | runtime/vm/isolate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698