Index: runtime/vm/isolate.cc |
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc |
index 8ed08737a0cdfbcf2035f1acc675afbb7ab959c8..99cb0361b6b2b3c39fec1c4394d1e4fd609517a6 100644 |
--- a/runtime/vm/isolate.cc |
+++ b/runtime/vm/isolate.cc |
@@ -1552,7 +1552,8 @@ class FinalizeWeakPersistentHandlesVisitor : public HandleVisitor { |
void VisitHandle(uword addr) { |
FinalizablePersistentHandle* handle = |
reinterpret_cast<FinalizablePersistentHandle*>(addr); |
- handle->UpdateUnreachable(thread()->isolate()); |
+ FinalizationQueue* queue = NULL; // Finalize in the foreground. |
+ handle->UpdateUnreachable(thread()->isolate(), queue); |
} |
private: |
@@ -1675,10 +1676,20 @@ void Isolate::Shutdown() { |
if (heap_ != NULL) { |
// Wait for any concurrent GC tasks to finish before shutting down. |
// TODO(koda): Support faster sweeper shutdown (e.g., after current page). |
- PageSpace* old_space = heap_->old_space(); |
- MonitorLocker ml(old_space->tasks_lock()); |
- while (old_space->tasks() > 0) { |
- ml.Wait(); |
+ { |
+ PageSpace* old_space = heap_->old_space(); |
+ MonitorLocker ml(old_space->tasks_lock()); |
+ while (old_space->tasks() > 0) { |
+ ml.Wait(); |
+ } |
+ } |
+ |
+ // Wait for background finalization to finish before shutting down. |
+ { |
+ MonitorLocker ml(heap_->finalization_tasks_lock()); |
+ while (heap_->finalization_tasks() > 0) { |
+ ml.Wait(); |
+ } |
} |
} |