Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(73)

Side by Side Diff: content/renderer/render_thread_impl.cc

Issue 2159123002: Shutdown renderer main message loop before blink::shutdown() (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: update Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 680 matching lines...) Expand 10 before | Expand all | Expand 10 after
691 peer_connection_tracker_.reset(new PeerConnectionTracker()); 691 peer_connection_tracker_.reset(new PeerConnectionTracker());
692 AddObserver(peer_connection_tracker_.get()); 692 AddObserver(peer_connection_tracker_.get());
693 693
694 p2p_socket_dispatcher_ = new P2PSocketDispatcher(GetIOTaskRunner().get()); 694 p2p_socket_dispatcher_ = new P2PSocketDispatcher(GetIOTaskRunner().get());
695 AddFilter(p2p_socket_dispatcher_.get()); 695 AddFilter(p2p_socket_dispatcher_.get());
696 696
697 peer_connection_factory_.reset( 697 peer_connection_factory_.reset(
698 new PeerConnectionDependencyFactory(p2p_socket_dispatcher_.get())); 698 new PeerConnectionDependencyFactory(p2p_socket_dispatcher_.get()));
699 699
700 aec_dump_message_filter_ = new AecDumpMessageFilter( 700 aec_dump_message_filter_ = new AecDumpMessageFilter(
701 GetIOTaskRunner(), message_loop()->task_runner()); 701 GetIOTaskRunner(), main_task_runner());
702 702
703 AddFilter(aec_dump_message_filter_.get()); 703 AddFilter(aec_dump_message_filter_.get());
704 704
705 #endif // defined(ENABLE_WEBRTC) 705 #endif // defined(ENABLE_WEBRTC)
706 706
707 audio_input_message_filter_ = new AudioInputMessageFilter(GetIOTaskRunner()); 707 audio_input_message_filter_ = new AudioInputMessageFilter(GetIOTaskRunner());
708 AddFilter(audio_input_message_filter_.get()); 708 AddFilter(audio_input_message_filter_.get());
709 709
710 audio_message_filter_ = new AudioMessageFilter(GetIOTaskRunner()); 710 audio_message_filter_ = new AudioMessageFilter(GetIOTaskRunner());
711 AddFilter(audio_message_filter_.get()); 711 AddFilter(audio_message_filter_.get());
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
981 renderer_scheduler_->Shutdown(); 981 renderer_scheduler_->Shutdown();
982 if (main_message_loop_) 982 if (main_message_loop_)
983 base::RunLoop().RunUntilIdle(); 983 base::RunLoop().RunUntilIdle();
984 984
985 if (blink_platform_impl_) { 985 if (blink_platform_impl_) {
986 blink_platform_impl_->Shutdown(); 986 blink_platform_impl_->Shutdown();
987 // This must be at the very end of the shutdown sequence. 987 // This must be at the very end of the shutdown sequence.
988 // blink::shutdown() must be called after all strong references from 988 // blink::shutdown() must be called after all strong references from
989 // Chromium to Blink are cleared. 989 // Chromium to Blink are cleared.
990 blink::shutdown(); 990 blink::shutdown();
991
992 // Clear the message loop here because pending tasks can hold Persintent
993 // handle to GCed object, which can not outlive Oilpan heap.
994 if (main_message_loop_)
995 base::RunLoop().RunUntilIdle();
996 main_message_loop_ = nullptr;
997
998 blink::Platform::shutdown();
991 } 999 }
992 1000
993 // Delay shutting down DiscardableSharedMemoryManager until blink::shutdown 1001 // Delay shutting down DiscardableSharedMemoryManager until blink::shutdown
994 // is complete, because blink::shutdown destructs Blink Resources and they 1002 // is complete, because blink::shutdown destructs Blink Resources and they
995 // may try to unlock their underlying discardable memory. 1003 // may try to unlock their underlying discardable memory.
996 ChildThreadImpl::ShutdownDiscardableSharedMemoryManager(); 1004 ChildThreadImpl::ShutdownDiscardableSharedMemoryManager();
997 1005
998 // The message loop must be cleared after shutting down
999 // the DiscardableSharedMemoryManager, which needs to send messages
1000 // to the browser process.
1001 main_message_loop_.reset();
1002
1003 lazy_tls.Pointer()->Set(nullptr); 1006 lazy_tls.Pointer()->Set(nullptr);
1004 } 1007 }
1005 1008
1006 bool RenderThreadImpl::Send(IPC::Message* msg) { 1009 bool RenderThreadImpl::Send(IPC::Message* msg) {
1007 // There are cases where we want to pump asynchronous messages while waiting 1010 // There are cases where we want to pump asynchronous messages while waiting
1008 // synchronously for the replies to the message to be sent here. However, this 1011 // synchronously for the replies to the message to be sent here. However, this
1009 // may create an opportunity for re-entrancy into WebKit and other subsystems, 1012 // may create an opportunity for re-entrancy into WebKit and other subsystems,
1010 // so we need to take care to disable callbacks, timers, and pending network 1013 // so we need to take care to disable callbacks, timers, and pending network
1011 // loads that could trigger such callbacks. 1014 // loads that could trigger such callbacks.
1012 bool pumping_events = false; 1015 bool pumping_events = false;
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
1179 #ifdef ENABLE_VTUNE_JIT_INTERFACE 1182 #ifdef ENABLE_VTUNE_JIT_INTERFACE
1180 if (command_line.HasSwitch(switches::kEnableVtune)) 1183 if (command_line.HasSwitch(switches::kEnableVtune))
1181 gin::Debug::SetJitCodeEventHandler(vTune::GetVtuneCodeEventHandler()); 1184 gin::Debug::SetJitCodeEventHandler(vTune::GetVtuneCodeEventHandler());
1182 #endif 1185 #endif
1183 1186
1184 SetRuntimeFeaturesDefaultsAndUpdateFromArgs(command_line); 1187 SetRuntimeFeaturesDefaultsAndUpdateFromArgs(command_line);
1185 1188
1186 blink_platform_impl_.reset(new RendererBlinkPlatformImpl( 1189 blink_platform_impl_.reset(new RendererBlinkPlatformImpl(
1187 renderer_scheduler_.get(), 1190 renderer_scheduler_.get(),
1188 GetRemoteInterfaces()->GetWeakPtr())); 1191 GetRemoteInterfaces()->GetWeakPtr()));
1189 blink::initialize(blink_platform_impl_.get()); 1192 blink::Platform::initialize(blink_platform_impl_.get());
1193 blink::initialize();
1190 1194
1191 v8::Isolate* isolate = blink::mainThreadIsolate(); 1195 v8::Isolate* isolate = blink::mainThreadIsolate();
1192 isolate->SetCreateHistogramFunction(CreateHistogram); 1196 isolate->SetCreateHistogramFunction(CreateHistogram);
1193 isolate->SetAddHistogramSampleFunction(AddHistogramSample); 1197 isolate->SetAddHistogramSampleFunction(AddHistogramSample);
1194 renderer_scheduler_->SetRAILModeObserver(this); 1198 renderer_scheduler_->SetRAILModeObserver(this);
1195 1199
1196 main_thread_compositor_task_runner_ = 1200 main_thread_compositor_task_runner_ =
1197 renderer_scheduler_->CompositorTaskRunner(); 1201 renderer_scheduler_->CompositorTaskRunner();
1198 1202
1199 main_input_callback_.Reset( 1203 main_input_callback_.Reset(
(...skipping 866 matching lines...) Expand 10 before | Expand all | Expand 10 after
2066 // Purge Skia font cache, by setting it to 0 and then again to the 2070 // Purge Skia font cache, by setting it to 0 and then again to the
2067 // previous limit. 2071 // previous limit.
2068 size_t font_cache_limit = SkGraphics::SetFontCacheLimit(0); 2072 size_t font_cache_limit = SkGraphics::SetFontCacheLimit(0);
2069 SkGraphics::SetFontCacheLimit(font_cache_limit); 2073 SkGraphics::SetFontCacheLimit(font_cache_limit);
2070 } 2074 }
2071 } 2075 }
2072 } 2076 }
2073 2077
2074 scoped_refptr<base::SingleThreadTaskRunner> 2078 scoped_refptr<base::SingleThreadTaskRunner>
2075 RenderThreadImpl::GetFileThreadTaskRunner() { 2079 RenderThreadImpl::GetFileThreadTaskRunner() {
2076 DCHECK(message_loop()->task_runner()->BelongsToCurrentThread()); 2080 DCHECK(main_task_runner()->BelongsToCurrentThread());
2077 if (!file_thread_) { 2081 if (!file_thread_) {
2078 file_thread_.reset(new base::Thread("Renderer::FILE")); 2082 file_thread_.reset(new base::Thread("Renderer::FILE"));
2079 file_thread_->Start(); 2083 file_thread_->Start();
2080 } 2084 }
2081 return file_thread_->task_runner(); 2085 return file_thread_->task_runner();
2082 } 2086 }
2083 2087
2084 scoped_refptr<base::SingleThreadTaskRunner> 2088 scoped_refptr<base::SingleThreadTaskRunner>
2085 RenderThreadImpl::GetMediaThreadTaskRunner() { 2089 RenderThreadImpl::GetMediaThreadTaskRunner() {
2086 DCHECK(message_loop()->task_runner()->BelongsToCurrentThread()); 2090 DCHECK(main_task_runner()->BelongsToCurrentThread());
2087 if (!media_thread_) { 2091 if (!media_thread_) {
2088 media_thread_.reset(new base::Thread("Media")); 2092 media_thread_.reset(new base::Thread("Media"));
2089 media_thread_->Start(); 2093 media_thread_->Start();
2090 2094
2091 #if defined(OS_ANDROID) 2095 #if defined(OS_ANDROID)
2092 renderer_demuxer_ = new RendererDemuxerAndroid(); 2096 renderer_demuxer_ = new RendererDemuxerAndroid();
2093 AddFilter(renderer_demuxer_.get()); 2097 AddFilter(renderer_demuxer_.get());
2094 #endif 2098 #endif
2095 } 2099 }
2096 return media_thread_->task_runner(); 2100 return media_thread_->task_runner();
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
2239 v8_memory_pressure_level == v8::MemoryPressureLevel::kCritical) 2243 v8_memory_pressure_level == v8::MemoryPressureLevel::kCritical)
2240 v8_memory_pressure_level = v8::MemoryPressureLevel::kModerate; 2244 v8_memory_pressure_level = v8::MemoryPressureLevel::kModerate;
2241 2245
2242 blink::mainThreadIsolate()->MemoryPressureNotification( 2246 blink::mainThreadIsolate()->MemoryPressureNotification(
2243 v8_memory_pressure_level); 2247 v8_memory_pressure_level);
2244 blink::MemoryPressureNotificationToWorkerThreadIsolates( 2248 blink::MemoryPressureNotificationToWorkerThreadIsolates(
2245 v8_memory_pressure_level); 2249 v8_memory_pressure_level);
2246 } 2250 }
2247 2251
2248 } // namespace content 2252 } // namespace content
OLDNEW
« no previous file with comments | « content/public/test/render_view_test.cc ('k') | content/test/test_blink_web_unit_test_support.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698