Index: runtime/vm/isolate.cc |
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc |
index 8ed08737a0cdfbcf2035f1acc675afbb7ab959c8..f18a7e810132171fe849d70d4b27c31be7bcfc49 100644 |
--- a/runtime/vm/isolate.cc |
+++ b/runtime/vm/isolate.cc |
@@ -1552,7 +1552,7 @@ class FinalizeWeakPersistentHandlesVisitor : public HandleVisitor { |
void VisitHandle(uword addr) { |
FinalizablePersistentHandle* handle = |
reinterpret_cast<FinalizablePersistentHandle*>(addr); |
- handle->UpdateUnreachable(thread()->isolate()); |
+ handle->UpdateUnreachableFinalizeNow(thread()->isolate()); |
} |
private: |
@@ -1675,10 +1675,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(); |
+ } |
} |
} |