Index: content/renderer/render_thread_impl.cc |
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc |
index 526e454c5496a46da6892626ea8a48b0f75a8468..a6ba224890db29727486a1ada531d87055d337d8 100644 |
--- a/content/renderer/render_thread_impl.cc |
+++ b/content/renderer/render_thread_impl.cc |
@@ -971,12 +971,25 @@ |
// objects after Blink shuts down. |
renderer_scheduler_->SetRAILModeObserver(nullptr); |
renderer_scheduler_->Shutdown(); |
- |
- ChildThreadImpl::ShutdownDiscardableSharedMemoryManager(); |
- |
if (main_message_loop_) |
base::RunLoop().RunUntilIdle(); |
+ if (blink_platform_impl_) { |
+ blink_platform_impl_->Shutdown(); |
+ // This must be at the very end of the shutdown sequence. |
+ // blink::shutdown() must be called after all strong references from |
+ // Chromium to Blink are cleared. |
+ blink::shutdown(); |
+ } |
+ |
+ // Delay shutting down DiscardableSharedMemoryManager until blink::shutdown |
+ // is complete, because blink::shutdown destructs Blink Resources and they |
+ // may try to unlock their underlying discardable memory. |
+ ChildThreadImpl::ShutdownDiscardableSharedMemoryManager(); |
+ |
+ // The message loop must be cleared after shutting down |
+ // the DiscardableSharedMemoryManager, which needs to send messages |
+ // to the browser process. |
main_message_loop_.reset(); |
lazy_tls.Pointer()->Set(nullptr); |