Index: runtime/vm/scavenger.cc |
diff --git a/runtime/vm/scavenger.cc b/runtime/vm/scavenger.cc |
index 306a78a4978ac104cb62f3d870690a344235ff12..f68145990d582f609f570401a232c8630bebb2d9 100644 |
--- a/runtime/vm/scavenger.cc |
+++ b/runtime/vm/scavenger.cc |
@@ -193,10 +193,13 @@ class ScavengerVisitor : public ObjectPointerVisitor { |
class ScavengerWeakVisitor : public HandleVisitor { |
public: |
- explicit ScavengerWeakVisitor(Scavenger* scavenger) |
- : HandleVisitor(Thread::Current()), |
- scavenger_(scavenger) { |
- ASSERT(scavenger->heap_->isolate() == Thread::Current()->isolate()); |
+ ScavengerWeakVisitor(Thread* thread, |
+ Scavenger* scavenger, |
+ FinalizationQueue* finalization_queue) : |
+ HandleVisitor(thread), |
+ scavenger_(scavenger), |
+ queue_(finalization_queue) { |
+ ASSERT(scavenger->heap_->isolate() == thread->isolate()); |
} |
void VisitHandle(uword addr) { |
@@ -204,7 +207,7 @@ class ScavengerWeakVisitor : public HandleVisitor { |
reinterpret_cast<FinalizablePersistentHandle*>(addr); |
RawObject** p = handle->raw_addr(); |
if (scavenger_->IsUnreachable(p)) { |
- handle->UpdateUnreachable(thread()->isolate()); |
+ handle->UpdateUnreachable(thread()->isolate(), queue_); |
} else { |
handle->UpdateRelocated(thread()->isolate()); |
} |
@@ -212,6 +215,7 @@ class ScavengerWeakVisitor : public HandleVisitor { |
private: |
Scavenger* scavenger_; |
+ FinalizationQueue* queue_; |
DISALLOW_COPY_AND_ASSIGN(ScavengerWeakVisitor); |
}; |
@@ -812,8 +816,14 @@ void Scavenger::Scavenge(bool invoke_api_callbacks) { |
int64_t middle = OS::GetCurrentTimeMicros(); |
{ |
TIMELINE_FUNCTION_GC_DURATION(thread, "WeakHandleProcessing"); |
- ScavengerWeakVisitor weak_visitor(this); |
+ FinalizationQueue* queue = new FinalizationQueue(); |
+ ScavengerWeakVisitor weak_visitor(thread, this, queue); |
IterateWeakRoots(isolate, &weak_visitor); |
+ if (queue->length() > 0) { |
+ Dart::thread_pool()->Run(new BackgroundFinalizer(isolate, queue)); |
+ } else { |
+ delete queue; |
+ } |
} |
ProcessWeakReferences(); |
page_space->ReleaseDataLock(); |