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

Unified Diff: runtime/vm/scavenger.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/scavenger.h ('k') | runtime/vm/thread_test.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/scavenger.cc
diff --git a/runtime/vm/scavenger.cc b/runtime/vm/scavenger.cc
index c2822b547e7135461da587c16ded3a73378112f5..6d9799e8883717d650a6aa52e34ae06f546e3bdc 100644
--- a/runtime/vm/scavenger.cc
+++ b/runtime/vm/scavenger.cc
@@ -255,12 +255,9 @@ class ScavengerVisitor : public ObjectPointerVisitor {
class ScavengerWeakVisitor : public HandleVisitor {
public:
- // 'prologue_weak_were_strong' is currently only used for sanity checking.
- explicit ScavengerWeakVisitor(Scavenger* scavenger,
- bool prologue_weak_were_strong)
+ explicit ScavengerWeakVisitor(Scavenger* scavenger)
: HandleVisitor(Thread::Current()),
- scavenger_(scavenger),
- prologue_weak_were_strong_(prologue_weak_were_strong) {
+ scavenger_(scavenger) {
ASSERT(scavenger->heap_->isolate() == Thread::Current()->isolate());
}
@@ -269,8 +266,6 @@ class ScavengerWeakVisitor : public HandleVisitor {
reinterpret_cast<FinalizablePersistentHandle*>(addr);
RawObject** p = handle->raw_addr();
if (scavenger_->IsUnreachable(p)) {
- ASSERT(!handle->IsPrologueWeakPersistent() ||
- !prologue_weak_were_strong_);
handle->UpdateUnreachable(thread()->isolate());
} else {
handle->UpdateRelocated(thread()->isolate());
@@ -279,7 +274,6 @@ class ScavengerWeakVisitor : public HandleVisitor {
private:
Scavenger* scavenger_;
- bool prologue_weak_were_strong_;
DISALLOW_COPY_AND_ASSIGN(ScavengerWeakVisitor);
};
@@ -561,12 +555,9 @@ void Scavenger::IterateObjectIdTable(Isolate* isolate,
}
-void Scavenger::IterateRoots(Isolate* isolate,
- ScavengerVisitor* visitor,
- bool visit_prologue_weak_persistent_handles) {
+void Scavenger::IterateRoots(Isolate* isolate, ScavengerVisitor* visitor) {
int64_t start = OS::GetCurrentTimeMicros();
isolate->VisitObjectPointers(visitor,
- visit_prologue_weak_persistent_handles,
StackFrameIterator::kDontValidateFrames);
int64_t middle = OS::GetCurrentTimeMicros();
IterateStoreBuffers(isolate, visitor);
@@ -600,81 +591,8 @@ bool Scavenger::IsUnreachable(RawObject** p) {
}
-void Scavenger::IterateWeakReferences(Isolate* isolate,
- ScavengerVisitor* 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 scavenged.
- 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) {
- RawObject** raw_obj_addr = reference_set->get_value(v);
- RawObject* raw_obj = *raw_obj_addr;
- // Only visit heap objects which are in from space, aka new objects
- // not in to space. This avoids visiting a value multiple times
- // during a scavenge.
- if (raw_obj->IsHeapObject() &&
- raw_obj->IsNewObject() &&
- !to_->Contains(RawObject::ToAddr(raw_obj))) {
- visitor->VisitPointer(raw_obj_addr);
- }
- }
- 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 scavenged.
- if (is_unreachable) {
- state->DelayWeakReferenceSet(reference_set);
- }
- }
- if ((resolved_top_ < top_) || PromotedStackHasMore()) {
- ProcessToSpace(visitor);
- } else {
- // 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.
-}
-
-
-void Scavenger::IterateWeakRoots(Isolate* isolate,
- HandleVisitor* visitor,
- bool visit_prologue_weak_persistent_handles) {
- isolate->VisitWeakPersistentHandles(visitor,
- visit_prologue_weak_persistent_handles);
+void Scavenger::IterateWeakRoots(Isolate* isolate, HandleVisitor* visitor) {
+ isolate->VisitWeakPersistentHandles(visitor);
}
@@ -873,16 +791,12 @@ void Scavenger::Scavenge(bool invoke_api_callbacks) {
// Setup the visitor and run the scavenge.
ScavengerVisitor visitor(isolate, this, from);
page_space->AcquireDataLock();
- const bool prologue_weak_are_strong = !invoke_api_callbacks;
- IterateRoots(isolate, &visitor, prologue_weak_are_strong);
+ IterateRoots(isolate, &visitor);
int64_t start = OS::GetCurrentTimeMicros();
ProcessToSpace(&visitor);
int64_t middle = OS::GetCurrentTimeMicros();
- IterateWeakReferences(isolate, &visitor);
- ScavengerWeakVisitor weak_visitor(this, prologue_weak_are_strong);
- // Include the prologue weak handles, since we must process any promotion.
- const bool visit_prologue_weak_handles = true;
- IterateWeakRoots(isolate, &weak_visitor, visit_prologue_weak_handles);
+ ScavengerWeakVisitor weak_visitor(this);
+ IterateWeakRoots(isolate, &weak_visitor);
visitor.Finalize();
ProcessWeakTables();
page_space->ReleaseDataLock();
« no previous file with comments | « runtime/vm/scavenger.h ('k') | runtime/vm/thread_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698