| 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();
|
|
|