Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/render_thread_impl.h" | 5 #include "content/renderer/render_thread_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <map> | 9 #include <map> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 918 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 929 // SequencedWorkerPool. Otherwise, it should already have been enabled. | 929 // SequencedWorkerPool. Otherwise, it should already have been enabled. |
| 930 // TODO(fdoray): Remove this once the SequencedWorkerPool to TaskScheduler | 930 // TODO(fdoray): Remove this once the SequencedWorkerPool to TaskScheduler |
| 931 // redirection experiment concludes https://crbug.com/622400. | 931 // redirection experiment concludes https://crbug.com/622400. |
| 932 if (!command_line.HasSwitch(switches::kSingleProcess)) | 932 if (!command_line.HasSwitch(switches::kSingleProcess)) |
| 933 base::SequencedWorkerPool::EnableForProcess(); | 933 base::SequencedWorkerPool::EnableForProcess(); |
| 934 } | 934 } |
| 935 | 935 |
| 936 RenderThreadImpl::~RenderThreadImpl() { | 936 RenderThreadImpl::~RenderThreadImpl() { |
| 937 } | 937 } |
| 938 | 938 |
| 939 void RenderThreadImpl::Shutdown() { | |
|
Torne
2017/01/11 12:50:58
Should we keep the override of Shutdown and just h
| |
| 940 for (auto& observer : observers_) | |
| 941 observer.OnRenderProcessShutdown(); | |
| 942 | |
| 943 if (memory_observer_) { | |
| 944 message_loop()->RemoveTaskObserver(memory_observer_.get()); | |
| 945 memory_observer_.reset(); | |
| 946 } | |
| 947 | |
| 948 // Wait for all databases to be closed. | |
| 949 if (blink_platform_impl_) { | |
| 950 // Crash the process if they fail to close after a generous amount of time. | |
| 951 bool all_closed = blink_platform_impl_->web_database_observer_impl() | |
| 952 ->WaitForAllDatabasesToClose(base::TimeDelta::FromSeconds(60)); | |
| 953 CHECK(all_closed); | |
| 954 } | |
| 955 | |
| 956 // Shutdown in reverse of the initialization order. | |
| 957 if (devtools_agent_message_filter_.get()) { | |
| 958 RemoveFilter(devtools_agent_message_filter_.get()); | |
| 959 devtools_agent_message_filter_ = nullptr; | |
| 960 } | |
| 961 | |
| 962 RemoveFilter(audio_input_message_filter_.get()); | |
| 963 audio_input_message_filter_ = nullptr; | |
| 964 | |
| 965 #if BUILDFLAG(ENABLE_WEBRTC) | |
| 966 RTCPeerConnectionHandler::DestructAllHandlers(); | |
| 967 // |peer_connection_factory_| cannot be deleted until after the main message | |
| 968 // loop has been destroyed. This is because there may be pending tasks that | |
| 969 // hold on to objects produced by the PC factory that depend on threads owned | |
| 970 // by the PC factory. Once those tasks have been freed, the factory can be | |
| 971 // deleted. | |
| 972 #endif | |
| 973 vc_manager_.reset(); | |
| 974 | |
| 975 RemoveFilter(db_message_filter_.get()); | |
| 976 db_message_filter_ = nullptr; | |
| 977 | |
| 978 // Shutdown the file thread if it's running. | |
| 979 if (file_thread_) | |
| 980 file_thread_->Stop(); | |
| 981 | |
| 982 if (compositor_message_filter_.get()) { | |
| 983 RemoveFilter(compositor_message_filter_.get()); | |
| 984 compositor_message_filter_ = nullptr; | |
| 985 } | |
| 986 | |
| 987 #if defined(OS_ANDROID) | |
| 988 if (sync_compositor_message_filter_) { | |
| 989 RemoveFilter(sync_compositor_message_filter_.get()); | |
| 990 sync_compositor_message_filter_ = nullptr; | |
| 991 } | |
| 992 stream_texture_factory_ = nullptr; | |
| 993 #endif | |
| 994 | |
| 995 media_thread_.reset(); | |
| 996 | |
| 997 blink_platform_impl_->SetCompositorThread(nullptr); | |
| 998 | |
| 999 compositor_thread_.reset(); | |
| 1000 | |
| 1001 // AudioMessageFilter may be accessed on |media_thread_|, so shutdown after. | |
| 1002 RemoveFilter(audio_message_filter_.get()); | |
| 1003 audio_message_filter_ = nullptr; | |
| 1004 | |
| 1005 categorized_worker_pool_->Shutdown(); | |
| 1006 | |
| 1007 main_input_callback_.Cancel(); | |
| 1008 input_handler_manager_.reset(); | |
| 1009 if (input_event_filter_.get()) { | |
| 1010 RemoveFilter(input_event_filter_.get()); | |
| 1011 input_event_filter_ = nullptr; | |
| 1012 } | |
| 1013 | |
| 1014 // RemoveEmbeddedWorkerRoute may be called while deleting | |
| 1015 // EmbeddedWorkerDispatcher. So it must be deleted before deleting | |
| 1016 // RenderThreadImpl. | |
| 1017 embedded_worker_dispatcher_.reset(); | |
| 1018 | |
| 1019 // Ramp down IDB before we ramp down WebKit (and V8), since IDB classes might | |
| 1020 // hold pointers to V8 objects (e.g., via pending requests). | |
| 1021 main_thread_indexed_db_dispatcher_.reset(); | |
| 1022 | |
| 1023 main_thread_compositor_task_runner_ = nullptr; | |
| 1024 | |
| 1025 gpu_factories_.clear(); | |
| 1026 | |
| 1027 // Context providers must be released prior to destroying the GPU channel. | |
| 1028 shared_worker_context_provider_ = nullptr; | |
| 1029 shared_main_thread_contexts_ = nullptr; | |
| 1030 | |
| 1031 if (gpu_channel_.get()) | |
| 1032 gpu_channel_->DestroyChannel(); | |
| 1033 | |
| 1034 ChildThreadImpl::Shutdown(); | |
| 1035 | |
| 1036 // Shut down the message loop (if provided when the RenderThreadImpl was | |
| 1037 // constructed) and the renderer scheduler before shutting down Blink. This | |
| 1038 // prevents a scenario where a pending task in the message loop accesses Blink | |
| 1039 // objects after Blink shuts down. | |
| 1040 renderer_scheduler_->SetRAILModeObserver(nullptr); | |
| 1041 renderer_scheduler_->Shutdown(); | |
| 1042 if (main_message_loop_) | |
| 1043 base::RunLoop().RunUntilIdle(); | |
| 1044 | |
| 1045 if (blink_platform_impl_) { | |
| 1046 blink_platform_impl_->Shutdown(); | |
| 1047 // This must be at the very end of the shutdown sequence. | |
| 1048 // blink::shutdown() must be called after all strong references from | |
| 1049 // Chromium to Blink are cleared. | |
| 1050 blink::shutdown(); | |
| 1051 } | |
| 1052 | |
| 1053 // Delay shutting down DiscardableSharedMemoryManager until blink::shutdown | |
| 1054 // is complete, because blink::shutdown destructs Blink Resources and they | |
| 1055 // may try to unlock their underlying discardable memory. | |
| 1056 discardable_shared_memory_manager_.reset(); | |
| 1057 | |
| 1058 // The message loop must be cleared after shutting down | |
| 1059 // the DiscardableSharedMemoryManager, which needs to send messages | |
| 1060 // to the browser process. | |
| 1061 main_message_loop_.reset(); | |
| 1062 | |
| 1063 lazy_tls.Pointer()->Set(nullptr); | |
| 1064 | |
| 1065 base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(this); | |
| 1066 } | |
| 1067 | |
| 1068 bool RenderThreadImpl::Send(IPC::Message* msg) { | 939 bool RenderThreadImpl::Send(IPC::Message* msg) { |
| 1069 // There are cases where we want to pump asynchronous messages while waiting | 940 // There are cases where we want to pump asynchronous messages while waiting |
| 1070 // synchronously for the replies to the message to be sent here. However, this | 941 // synchronously for the replies to the message to be sent here. However, this |
| 1071 // may create an opportunity for re-entrancy into WebKit and other subsystems, | 942 // may create an opportunity for re-entrancy into WebKit and other subsystems, |
| 1072 // so we need to take care to disable callbacks, timers, and pending network | 943 // so we need to take care to disable callbacks, timers, and pending network |
| 1073 // loads that could trigger such callbacks. | 944 // loads that could trigger such callbacks. |
| 1074 bool pumping_events = false; | 945 bool pumping_events = false; |
| 1075 if (msg->is_sync()) { | 946 if (msg->is_sync()) { |
| 1076 if (msg->is_caller_pumping_messages()) { | 947 if (msg->is_caller_pumping_messages()) { |
| 1077 pumping_events = true; | 948 pumping_events = true; |
| (...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1595 } | 1466 } |
| 1596 | 1467 |
| 1597 base::WaitableEvent* RenderThreadImpl::GetShutdownEvent() { | 1468 base::WaitableEvent* RenderThreadImpl::GetShutdownEvent() { |
| 1598 return ChildProcess::current()->GetShutDownEvent(); | 1469 return ChildProcess::current()->GetShutDownEvent(); |
| 1599 } | 1470 } |
| 1600 | 1471 |
| 1601 int32_t RenderThreadImpl::GetClientId() { | 1472 int32_t RenderThreadImpl::GetClientId() { |
| 1602 return client_id_; | 1473 return client_id_; |
| 1603 } | 1474 } |
| 1604 | 1475 |
| 1476 bool RenderThreadImpl::IsRenderThread() { | |
| 1477 return true; | |
| 1478 } | |
| 1479 | |
| 1605 void RenderThreadImpl::OnAssociatedInterfaceRequest( | 1480 void RenderThreadImpl::OnAssociatedInterfaceRequest( |
| 1606 const std::string& name, | 1481 const std::string& name, |
| 1607 mojo::ScopedInterfaceEndpointHandle handle) { | 1482 mojo::ScopedInterfaceEndpointHandle handle) { |
| 1608 associated_interfaces_.BindRequest(name, std::move(handle)); | 1483 associated_interfaces_.BindRequest(name, std::move(handle)); |
| 1609 } | 1484 } |
| 1610 | 1485 |
| 1611 bool RenderThreadImpl::IsGpuRasterizationForced() { | 1486 bool RenderThreadImpl::IsGpuRasterizationForced() { |
| 1612 return is_gpu_rasterization_forced_; | 1487 return is_gpu_rasterization_forced_; |
| 1613 } | 1488 } |
| 1614 | 1489 |
| (...skipping 886 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2501 } | 2376 } |
| 2502 } | 2377 } |
| 2503 | 2378 |
| 2504 void RenderThreadImpl::OnRendererInterfaceRequest( | 2379 void RenderThreadImpl::OnRendererInterfaceRequest( |
| 2505 mojom::RendererAssociatedRequest request) { | 2380 mojom::RendererAssociatedRequest request) { |
| 2506 DCHECK(!renderer_binding_.is_bound()); | 2381 DCHECK(!renderer_binding_.is_bound()); |
| 2507 renderer_binding_.Bind(std::move(request)); | 2382 renderer_binding_.Bind(std::move(request)); |
| 2508 } | 2383 } |
| 2509 | 2384 |
| 2510 } // namespace content | 2385 } // namespace content |
| OLD | NEW |