Chromium Code Reviews| Index: runtime/vm/scavenger.cc |
| diff --git a/runtime/vm/scavenger.cc b/runtime/vm/scavenger.cc |
| index 2309e6ca2aa3bb5c5b08cdf062cc4556206060b5..8a862bac50a2bdf1872e1148e45b18d277496f47 100644 |
| --- a/runtime/vm/scavenger.cc |
| +++ b/runtime/vm/scavenger.cc |
| @@ -157,6 +157,7 @@ class ScavengerVisitor : public ObjectPointerVisitor { |
| NOT_IN_PRODUCT(class_table->UpdateAllocatedOld(cid, size)); |
| } else { |
| // Promotion did not succeed. Copy into the to space instead. |
| + scavenger_->failed_to_promote_ = true; |
| new_addr = scavenger_->TryAllocate(size); |
| NOT_IN_PRODUCT(class_table->UpdateLiveNew(cid, size)); |
| } |
| @@ -337,7 +338,8 @@ Scavenger::Scavenger(Heap* heap, |
| delayed_weak_properties_(NULL), |
| gc_time_micros_(0), |
| collections_(0), |
| - external_size_(0) { |
| + external_size_(0), |
| + failed_to_promote_(false) { |
| // Verify assumptions about the first word in objects which the scavenger is |
| // going to use for forwarding pointers. |
| ASSERT(Object::tags_offset() == 0); |
| @@ -787,6 +789,8 @@ void Scavenger::Scavenge(bool invoke_api_callbacks) { |
| ASSERT(!scavenging_); |
| scavenging_ = true; |
| + failed_to_promote_ = false; |
| + |
| PageSpace* page_space = heap_->old_space(); |
| NoSafepointScope no_safepoints; |
| @@ -896,4 +900,14 @@ void Scavenger::FreeExternal(intptr_t size) { |
| ASSERT(external_size_ >= 0); |
| } |
| +void Scavenger::Evacuate() { |
| + SafepointOperationScope scope(Thread::Current()); |
| + Scavenge(); |
|
rmacnak
2017/06/19 19:29:00
Can't we just update the promotion threshold and s
|
| + Scavenge(); |
| + |
| + // It is possible for objects to stay in the new space |
| + // if the VM cannot create more pages for these objects. |
| + ASSERT(UsedInWords() == 0 || failed_to_promote_); |
| +} |
| + |
| } // namespace dart |