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

Side by Side Diff: content/browser/browser_main_loop.cc

Issue 23691025: Adding shutdown tracing capabilities (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Moved the trace starting for OS'ses other then ChromeOS to a later point where is no user intervent… Created 7 years, 3 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 | Annotate | Revision Log
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/browser/browser_main_loop.h" 5 #include "content/browser/browser_main_loop.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/debug/trace_event.h" 9 #include "base/debug/trace_event.h"
10 #include "base/file_util.h" 10 #include "base/file_util.h"
(...skipping 680 matching lines...) Expand 10 before | Expand all | Expand 10 after
691 691
692 TRACE_EVENT_END_ETW("BrowserMain:MESSAGE_LOOP", 0, ""); 692 TRACE_EVENT_END_ETW("BrowserMain:MESSAGE_LOOP", 0, "");
693 } 693 }
694 694
695 void BrowserMainLoop::ShutdownThreadsAndCleanUp() { 695 void BrowserMainLoop::ShutdownThreadsAndCleanUp() {
696 696
697 if (!created_threads_) { 697 if (!created_threads_) {
698 // Called early, nothing to do 698 // Called early, nothing to do
699 return; 699 return;
700 } 700 }
701 TRACE_EVENT0("shutdown", "BrowserMainLoop::ShutdownThreadsAndCleanUp")
702
701 // Teardown may start in PostMainMessageLoopRun, and during teardown we 703 // Teardown may start in PostMainMessageLoopRun, and during teardown we
702 // need to be able to perform IO. 704 // need to be able to perform IO.
703 base::ThreadRestrictions::SetIOAllowed(true); 705 base::ThreadRestrictions::SetIOAllowed(true);
704 BrowserThread::PostTask( 706 BrowserThread::PostTask(
705 BrowserThread::IO, FROM_HERE, 707 BrowserThread::IO, FROM_HERE,
706 base::Bind(base::IgnoreResult(&base::ThreadRestrictions::SetIOAllowed), 708 base::Bind(base::IgnoreResult(&base::ThreadRestrictions::SetIOAllowed),
707 true)); 709 true));
708 710
709 if (parts_) 711 if (parts_) {
712 TRACE_EVENT0("shutdown",
713 "BrowserMainLoop::Subsystem:PostMainMessageLoopRun");
710 parts_->PostMainMessageLoopRun(); 714 parts_->PostMainMessageLoopRun();
715 }
711 716
712 trace_memory_controller_.reset(); 717 trace_memory_controller_.reset();
713 718
714 #if !defined(OS_IOS) 719 #if !defined(OS_IOS)
715 // Destroying the GpuProcessHostUIShims on the UI thread posts a task to 720 // Destroying the GpuProcessHostUIShims on the UI thread posts a task to
716 // delete related objects on the GPU thread. This must be done before 721 // delete related objects on the GPU thread. This must be done before
717 // stopping the GPU thread. The GPU thread will close IPC channels to renderer 722 // stopping the GPU thread. The GPU thread will close IPC channels to renderer
718 // processes so this has to happen before stopping the IO thread. 723 // processes so this has to happen before stopping the IO thread.
719 GpuProcessHostUIShim::DestroyAll(); 724 {
720 725 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:GPUProcessHostShim");
726 GpuProcessHostUIShim::DestroyAll();
727 }
721 // Cancel pending requests and prevent new requests. 728 // Cancel pending requests and prevent new requests.
722 if (resource_dispatcher_host_) 729 if (resource_dispatcher_host_) {
730 TRACE_EVENT0("shutdown",
731 "BrowserMainLoop::Subsystem:ResourceDispatcherHost");
723 resource_dispatcher_host_.get()->Shutdown(); 732 resource_dispatcher_host_.get()->Shutdown();
733 }
724 734
725 #if defined(USE_AURA) 735 #if defined(USE_AURA)
726 ImageTransportFactory::Terminate(); 736 {
737 TRACE_EVENT0("shutdown",
738 "BrowserMainLoop::Subsystem:ImageTransportFactory");
739 ImageTransportFactory::Terminate();
740 }
727 #endif 741 #endif
728 742
729 // The device monitors are using |system_monitor_| as dependency, so delete 743 // The device monitors are using |system_monitor_| as dependency, so delete
730 // them before |system_monitor_| goes away. 744 // them before |system_monitor_| goes away.
731 // On Mac and windows, the monitor needs to be destroyed on the same thread 745 // On Mac and windows, the monitor needs to be destroyed on the same thread
732 // as they were created. On Linux, the monitor will be deleted when IO thread 746 // as they were created. On Linux, the monitor will be deleted when IO thread
733 // goes away. 747 // goes away.
734 #if defined(OS_WIN) 748 #if defined(OS_WIN)
735 system_message_window_.reset(); 749 system_message_window_.reset();
736 #elif defined(OS_MACOSX) 750 #elif defined(OS_MACOSX)
(...skipping 16 matching lines...) Expand all
753 // 767 //
754 // 768 //
755 // - The IO thread is the only user of the CACHE thread. 769 // - The IO thread is the only user of the CACHE thread.
756 // 770 //
757 // - The PROCESS_LAUNCHER thread must be stopped after IO in case 771 // - The PROCESS_LAUNCHER thread must be stopped after IO in case
758 // the IO thread posted a task to terminate a process on the 772 // the IO thread posted a task to terminate a process on the
759 // process launcher thread. 773 // process launcher thread.
760 // 774 //
761 // - (Not sure why DB stops last.) 775 // - (Not sure why DB stops last.)
762 switch (thread_id) { 776 switch (thread_id) {
763 case BrowserThread::DB: 777 case BrowserThread::DB: {
764 db_thread_.reset(); 778 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:DBThread");
779 db_thread_.reset();
780 }
765 break; 781 break;
766 case BrowserThread::FILE_USER_BLOCKING: 782 case BrowserThread::FILE_USER_BLOCKING: {
767 file_user_blocking_thread_.reset(); 783 TRACE_EVENT0("shutdown",
784 "BrowserMainLoop::Subsystem:FileUserBlockingThread");
785 file_user_blocking_thread_.reset();
786 }
768 break; 787 break;
769 case BrowserThread::FILE: 788 case BrowserThread::FILE: {
789 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:FileThread");
770 #if !defined(OS_IOS) 790 #if !defined(OS_IOS)
771 // Clean up state that lives on or uses the file_thread_ before 791 // Clean up state that lives on or uses the file_thread_ before
772 // it goes away. 792 // it goes away.
773 if (resource_dispatcher_host_) 793 if (resource_dispatcher_host_)
774 resource_dispatcher_host_.get()->save_file_manager()->Shutdown(); 794 resource_dispatcher_host_.get()->save_file_manager()->Shutdown();
775 #endif // !defined(OS_IOS) 795 #endif // !defined(OS_IOS)
776 file_thread_.reset(); 796 file_thread_.reset();
797 }
777 break; 798 break;
778 case BrowserThread::PROCESS_LAUNCHER: 799 case BrowserThread::PROCESS_LAUNCHER: {
779 process_launcher_thread_.reset(); 800 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:LauncherThread");
801 process_launcher_thread_.reset();
802 }
780 break; 803 break;
781 case BrowserThread::CACHE: 804 case BrowserThread::CACHE: {
782 cache_thread_.reset(); 805 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:CacheThread");
806 cache_thread_.reset();
807 }
783 break; 808 break;
784 case BrowserThread::IO: 809 case BrowserThread::IO: {
785 io_thread_.reset(); 810 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:IOThread");
811 io_thread_.reset();
812 }
786 break; 813 break;
787 case BrowserThread::UI: 814 case BrowserThread::UI:
788 case BrowserThread::ID_COUNT: 815 case BrowserThread::ID_COUNT:
789 default: 816 default:
790 NOTREACHED(); 817 NOTREACHED();
791 break; 818 break;
792 } 819 }
793 } 820 }
794 821
795 #if !defined(OS_IOS) 822 #if !defined(OS_IOS)
796 indexed_db_thread_.reset(); 823 {
824 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:IndexedDBThread");
825 indexed_db_thread_.reset();
826 }
797 #endif 827 #endif
798 828
799 // Close the blocking I/O pool after the other threads. Other threads such 829 // Close the blocking I/O pool after the other threads. Other threads such
800 // as the I/O thread may need to schedule work like closing files or flushing 830 // as the I/O thread may need to schedule work like closing files or flushing
801 // data during shutdown, so the blocking pool needs to be available. There 831 // data during shutdown, so the blocking pool needs to be available. There
802 // may also be slow operations pending that will blcok shutdown, so closing 832 // may also be slow operations pending that will blcok shutdown, so closing
803 // it here (which will block until required operations are complete) gives 833 // it here (which will block until required operations are complete) gives
804 // more head start for those operations to finish. 834 // more head start for those operations to finish.
805 BrowserThreadImpl::ShutdownThreadPool(); 835 {
836 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:ThreadPool");
837 BrowserThreadImpl::ShutdownThreadPool();
838 }
806 839
807 #if !defined(OS_IOS) 840 #if !defined(OS_IOS)
808 // Must happen after the IO thread is shutdown since this may be accessed from 841 // Must happen after the IO thread is shutdown since this may be accessed from
809 // it. 842 // it.
810 BrowserGpuChannelHostFactory::Terminate(); 843 {
844 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:GPUChannelFactory");
845 BrowserGpuChannelHostFactory::Terminate();
846 }
811 847
812 // Must happen after the I/O thread is shutdown since this class lives on the 848 // Must happen after the I/O thread is shutdown since this class lives on the
813 // I/O thread and isn't threadsafe. 849 // I/O thread and isn't threadsafe.
814 GamepadService::GetInstance()->Terminate(); 850 {
815 DeviceInertialSensorService::GetInstance()->Shutdown(); 851 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:GamepadService");
816 852 GamepadService::GetInstance()->Terminate();
817 URLDataManager::DeleteDataSources(); 853 }
854 {
855 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:SensorService");
856 DeviceInertialSensorService::GetInstance()->Shutdown();
857 }
858 {
859 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:DeleteDataSources");
860 URLDataManager::DeleteDataSources();
861 }
818 #endif // !defined(OS_IOS) 862 #endif // !defined(OS_IOS)
819 863
820 if (parts_) 864 if (parts_) {
865 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:PostDestroyThreads");
821 parts_->PostDestroyThreads(); 866 parts_->PostDestroyThreads();
867 }
822 } 868 }
823 869
824 void BrowserMainLoop::InitializeMainThread() { 870 void BrowserMainLoop::InitializeMainThread() {
825 TRACE_EVENT0("startup", "BrowserMainLoop::InitializeMainThread") 871 TRACE_EVENT0("startup", "BrowserMainLoop::InitializeMainThread")
826 const char* kThreadName = "CrBrowserMain"; 872 const char* kThreadName = "CrBrowserMain";
827 base::PlatformThread::SetName(kThreadName); 873 base::PlatformThread::SetName(kThreadName);
828 if (main_message_loop_) 874 if (main_message_loop_)
829 main_message_loop_->set_thread_name(kThreadName); 875 main_message_loop_->set_thread_name(kThreadName);
830 876
831 // Register the main thread by instantiating it, but don't call any methods. 877 // Register the main thread by instantiating it, but don't call any methods.
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
989 if (parameters_.ui_task) 1035 if (parameters_.ui_task)
990 base::MessageLoopForUI::current()->PostTask(FROM_HERE, 1036 base::MessageLoopForUI::current()->PostTask(FROM_HERE,
991 *parameters_.ui_task); 1037 *parameters_.ui_task);
992 1038
993 base::RunLoop run_loop; 1039 base::RunLoop run_loop;
994 run_loop.Run(); 1040 run_loop.Run();
995 #endif 1041 #endif
996 } 1042 }
997 1043
998 } // namespace content 1044 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698