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

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: split out blink::Platform::initialize from blink::initialize 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 679 matching lines...) Expand 10 before | Expand all | Expand 10 after
690 peer_connection_tracker_.reset(new PeerConnectionTracker()); 690 peer_connection_tracker_.reset(new PeerConnectionTracker());
691 AddObserver(peer_connection_tracker_.get()); 691 AddObserver(peer_connection_tracker_.get());
692 692
693 p2p_socket_dispatcher_ = new P2PSocketDispatcher(GetIOTaskRunner().get()); 693 p2p_socket_dispatcher_ = new P2PSocketDispatcher(GetIOTaskRunner().get());
694 AddFilter(p2p_socket_dispatcher_.get()); 694 AddFilter(p2p_socket_dispatcher_.get());
695 695
696 peer_connection_factory_.reset( 696 peer_connection_factory_.reset(
697 new PeerConnectionDependencyFactory(p2p_socket_dispatcher_.get())); 697 new PeerConnectionDependencyFactory(p2p_socket_dispatcher_.get()));
698 698
699 aec_dump_message_filter_ = new AecDumpMessageFilter( 699 aec_dump_message_filter_ = new AecDumpMessageFilter(
700 GetIOTaskRunner(), message_loop()->task_runner()); 700 GetIOTaskRunner(), main_task_runner());
701 701
702 AddFilter(aec_dump_message_filter_.get()); 702 AddFilter(aec_dump_message_filter_.get());
703 703
704 #endif // defined(ENABLE_WEBRTC) 704 #endif // defined(ENABLE_WEBRTC)
705 705
706 audio_input_message_filter_ = new AudioInputMessageFilter(GetIOTaskRunner()); 706 audio_input_message_filter_ = new AudioInputMessageFilter(GetIOTaskRunner());
707 AddFilter(audio_input_message_filter_.get()); 707 AddFilter(audio_input_message_filter_.get());
708 708
709 audio_message_filter_ = new AudioMessageFilter(GetIOTaskRunner()); 709 audio_message_filter_ = new AudioMessageFilter(GetIOTaskRunner());
710 AddFilter(audio_message_filter_.get()); 710 AddFilter(audio_message_filter_.get());
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
980 renderer_scheduler_->Shutdown(); 980 renderer_scheduler_->Shutdown();
981 if (main_message_loop_) 981 if (main_message_loop_)
982 base::RunLoop().RunUntilIdle(); 982 base::RunLoop().RunUntilIdle();
983 983
984 if (blink_platform_impl_) { 984 if (blink_platform_impl_) {
985 blink_platform_impl_->Shutdown(); 985 blink_platform_impl_->Shutdown();
986 // This must be at the very end of the shutdown sequence. 986 // This must be at the very end of the shutdown sequence.
987 // blink::shutdown() must be called after all strong references from 987 // blink::shutdown() must be called after all strong references from
988 // Chromium to Blink are cleared. 988 // Chromium to Blink are cleared.
989 blink::shutdown(); 989 blink::shutdown();
990
991 // Clear the message loop here because pending tasks can hold Persintent
992 // handle to GCed object, which can not outlive Oilpan heap.
993 if (main_message_loop_)
994 base::RunLoop().RunUntilIdle();
kinuko 2016/08/09 14:12:18 Hmm, I feel uneasy calling this in production code
haraken 2016/08/09 15:46:58 Note that we're already calling RunUntilIdle at li
kinuko 2016/08/11 06:10:55 I see that we're already calling it... thanks. An
995 main_message_loop_ = nullptr;
996
997 blink::Platform::shutdown();
990 } 998 }
991 999
992 // Delay shutting down DiscardableSharedMemoryManager until blink::shutdown 1000 // Delay shutting down DiscardableSharedMemoryManager until blink::shutdown
993 // is complete, because blink::shutdown destructs Blink Resources and they 1001 // is complete, because blink::shutdown destructs Blink Resources and they
994 // may try to unlock their underlying discardable memory. 1002 // may try to unlock their underlying discardable memory.
995 ChildThreadImpl::ShutdownDiscardableSharedMemoryManager(); 1003 ChildThreadImpl::ShutdownDiscardableSharedMemoryManager();
996 1004
997 // The message loop must be cleared after shutting down
998 // the DiscardableSharedMemoryManager, which needs to send messages
999 // to the browser process.
1000 main_message_loop_.reset();
1001
1002 lazy_tls.Pointer()->Set(nullptr); 1005 lazy_tls.Pointer()->Set(nullptr);
1003 } 1006 }
1004 1007
1005 bool RenderThreadImpl::Send(IPC::Message* msg) { 1008 bool RenderThreadImpl::Send(IPC::Message* msg) {
1006 // There are cases where we want to pump asynchronous messages while waiting 1009 // There are cases where we want to pump asynchronous messages while waiting
1007 // synchronously for the replies to the message to be sent here. However, this 1010 // synchronously for the replies to the message to be sent here. However, this
1008 // may create an opportunity for re-entrancy into WebKit and other subsystems, 1011 // may create an opportunity for re-entrancy into WebKit and other subsystems,
1009 // so we need to take care to disable callbacks, timers, and pending network 1012 // so we need to take care to disable callbacks, timers, and pending network
1010 // loads that could trigger such callbacks. 1013 // loads that could trigger such callbacks.
1011 bool pumping_events = false; 1014 bool pumping_events = false;
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
1178 #ifdef ENABLE_VTUNE_JIT_INTERFACE 1181 #ifdef ENABLE_VTUNE_JIT_INTERFACE
1179 if (command_line.HasSwitch(switches::kEnableVtune)) 1182 if (command_line.HasSwitch(switches::kEnableVtune))
1180 gin::Debug::SetJitCodeEventHandler(vTune::GetVtuneCodeEventHandler()); 1183 gin::Debug::SetJitCodeEventHandler(vTune::GetVtuneCodeEventHandler());
1181 #endif 1184 #endif
1182 1185
1183 SetRuntimeFeaturesDefaultsAndUpdateFromArgs(command_line); 1186 SetRuntimeFeaturesDefaultsAndUpdateFromArgs(command_line);
1184 1187
1185 blink_platform_impl_.reset(new RendererBlinkPlatformImpl( 1188 blink_platform_impl_.reset(new RendererBlinkPlatformImpl(
1186 renderer_scheduler_.get(), 1189 renderer_scheduler_.get(),
1187 GetRemoteInterfaces()->GetWeakPtr())); 1190 GetRemoteInterfaces()->GetWeakPtr()));
1188 blink::initialize(blink_platform_impl_.get()); 1191 blink::Platform::initialize(blink_platform_impl_.get());
1192 blink::initialize();
1189 1193
1190 v8::Isolate* isolate = blink::mainThreadIsolate(); 1194 v8::Isolate* isolate = blink::mainThreadIsolate();
1191 isolate->SetCreateHistogramFunction(CreateHistogram); 1195 isolate->SetCreateHistogramFunction(CreateHistogram);
1192 isolate->SetAddHistogramSampleFunction(AddHistogramSample); 1196 isolate->SetAddHistogramSampleFunction(AddHistogramSample);
1193 renderer_scheduler_->SetRAILModeObserver(this); 1197 renderer_scheduler_->SetRAILModeObserver(this);
1194 1198
1195 main_thread_compositor_task_runner_ = 1199 main_thread_compositor_task_runner_ =
1196 renderer_scheduler_->CompositorTaskRunner(); 1200 renderer_scheduler_->CompositorTaskRunner();
1197 1201
1198 main_input_callback_.Reset( 1202 main_input_callback_.Reset(
(...skipping 863 matching lines...) Expand 10 before | Expand all | Expand 10 after
2062 // Purge Skia font cache, by setting it to 0 and then again to the 2066 // Purge Skia font cache, by setting it to 0 and then again to the
2063 // previous limit. 2067 // previous limit.
2064 size_t font_cache_limit = SkGraphics::SetFontCacheLimit(0); 2068 size_t font_cache_limit = SkGraphics::SetFontCacheLimit(0);
2065 SkGraphics::SetFontCacheLimit(font_cache_limit); 2069 SkGraphics::SetFontCacheLimit(font_cache_limit);
2066 } 2070 }
2067 } 2071 }
2068 } 2072 }
2069 2073
2070 scoped_refptr<base::SingleThreadTaskRunner> 2074 scoped_refptr<base::SingleThreadTaskRunner>
2071 RenderThreadImpl::GetFileThreadTaskRunner() { 2075 RenderThreadImpl::GetFileThreadTaskRunner() {
2072 DCHECK(message_loop()->task_runner()->BelongsToCurrentThread()); 2076 DCHECK(main_task_runner()->BelongsToCurrentThread());
2073 if (!file_thread_) { 2077 if (!file_thread_) {
2074 file_thread_.reset(new base::Thread("Renderer::FILE")); 2078 file_thread_.reset(new base::Thread("Renderer::FILE"));
2075 file_thread_->Start(); 2079 file_thread_->Start();
2076 } 2080 }
2077 return file_thread_->task_runner(); 2081 return file_thread_->task_runner();
2078 } 2082 }
2079 2083
2080 scoped_refptr<base::SingleThreadTaskRunner> 2084 scoped_refptr<base::SingleThreadTaskRunner>
2081 RenderThreadImpl::GetMediaThreadTaskRunner() { 2085 RenderThreadImpl::GetMediaThreadTaskRunner() {
2082 DCHECK(message_loop()->task_runner()->BelongsToCurrentThread()); 2086 DCHECK(main_task_runner()->BelongsToCurrentThread());
2083 if (!media_thread_) { 2087 if (!media_thread_) {
2084 media_thread_.reset(new base::Thread("Media")); 2088 media_thread_.reset(new base::Thread("Media"));
2085 media_thread_->Start(); 2089 media_thread_->Start();
2086 2090
2087 #if defined(OS_ANDROID) 2091 #if defined(OS_ANDROID)
2088 renderer_demuxer_ = new RendererDemuxerAndroid(); 2092 renderer_demuxer_ = new RendererDemuxerAndroid();
2089 AddFilter(renderer_demuxer_.get()); 2093 AddFilter(renderer_demuxer_.get());
2090 #endif 2094 #endif
2091 } 2095 }
2092 return media_thread_->task_runner(); 2096 return media_thread_->task_runner();
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
2235 v8_memory_pressure_level == v8::MemoryPressureLevel::kCritical) 2239 v8_memory_pressure_level == v8::MemoryPressureLevel::kCritical)
2236 v8_memory_pressure_level = v8::MemoryPressureLevel::kModerate; 2240 v8_memory_pressure_level = v8::MemoryPressureLevel::kModerate;
2237 2241
2238 blink::mainThreadIsolate()->MemoryPressureNotification( 2242 blink::mainThreadIsolate()->MemoryPressureNotification(
2239 v8_memory_pressure_level); 2243 v8_memory_pressure_level);
2240 blink::MemoryPressureNotificationToWorkerThreadIsolates( 2244 blink::MemoryPressureNotificationToWorkerThreadIsolates(
2241 v8_memory_pressure_level); 2245 v8_memory_pressure_level);
2242 } 2246 }
2243 2247
2244 } // namespace content 2248 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698