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/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 Loading... | |
| 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 { |
| 718 TRACE_EVENT0("shutdown", | |
|
James Cook
2013/08/30 22:54:02
You don't need this one - this controller doesn't
Mr4D (OOO till 08-26)
2013/08/31 02:03:44
Since that might change I thought it is better to
| |
| 719 "BrowserMainLoop::Subsystem:TraceMemoryController"); | |
| 720 trace_memory_controller_.reset(); | |
| 721 } | |
| 713 | 722 |
| 714 #if !defined(OS_IOS) | 723 #if !defined(OS_IOS) |
| 715 // Destroying the GpuProcessHostUIShims on the UI thread posts a task to | 724 // Destroying the GpuProcessHostUIShims on the UI thread posts a task to |
| 716 // delete related objects on the GPU thread. This must be done before | 725 // 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 | 726 // 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. | 727 // processes so this has to happen before stopping the IO thread. |
| 719 GpuProcessHostUIShim::DestroyAll(); | 728 { |
| 720 | 729 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:GPUProcessHostShim"); |
| 730 GpuProcessHostUIShim::DestroyAll(); | |
| 731 } | |
| 721 // Cancel pending requests and prevent new requests. | 732 // Cancel pending requests and prevent new requests. |
| 722 if (resource_dispatcher_host_) | 733 if (resource_dispatcher_host_) { |
| 734 TRACE_EVENT0("shutdown", | |
| 735 "BrowserMainLoop::Subsystem:ResourceDispatcherHost"); | |
| 723 resource_dispatcher_host_.get()->Shutdown(); | 736 resource_dispatcher_host_.get()->Shutdown(); |
| 737 } | |
| 724 | 738 |
| 725 #if defined(USE_AURA) | 739 #if defined(USE_AURA) |
| 726 ImageTransportFactory::Terminate(); | 740 { |
| 741 TRACE_EVENT0("shutdown", | |
| 742 "BrowserMainLoop::Subsystem:ImageTransportFactory"); | |
| 743 ImageTransportFactory::Terminate(); | |
| 744 } | |
| 727 #endif | 745 #endif |
| 728 | 746 |
| 729 // The device monitors are using |system_monitor_| as dependency, so delete | 747 // The device monitors are using |system_monitor_| as dependency, so delete |
| 730 // them before |system_monitor_| goes away. | 748 // them before |system_monitor_| goes away. |
| 731 // On Mac and windows, the monitor needs to be destroyed on the same thread | 749 // 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 | 750 // as they were created. On Linux, the monitor will be deleted when IO thread |
| 733 // goes away. | 751 // goes away. |
| 734 #if defined(OS_WIN) | 752 #if defined(OS_WIN) |
| 735 system_message_window_.reset(); | 753 system_message_window_.reset(); |
| 736 #elif defined(OS_MACOSX) | 754 #elif defined(OS_MACOSX) |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 753 // | 771 // |
| 754 // | 772 // |
| 755 // - The IO thread is the only user of the CACHE thread. | 773 // - The IO thread is the only user of the CACHE thread. |
| 756 // | 774 // |
| 757 // - The PROCESS_LAUNCHER thread must be stopped after IO in case | 775 // - The PROCESS_LAUNCHER thread must be stopped after IO in case |
| 758 // the IO thread posted a task to terminate a process on the | 776 // the IO thread posted a task to terminate a process on the |
| 759 // process launcher thread. | 777 // process launcher thread. |
| 760 // | 778 // |
| 761 // - (Not sure why DB stops last.) | 779 // - (Not sure why DB stops last.) |
| 762 switch (thread_id) { | 780 switch (thread_id) { |
| 763 case BrowserThread::DB: | 781 case BrowserThread::DB: { |
| 764 db_thread_.reset(); | 782 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:DBThread"); |
| 783 db_thread_.reset(); | |
| 784 } | |
| 765 break; | 785 break; |
| 766 case BrowserThread::FILE_USER_BLOCKING: | 786 case BrowserThread::FILE_USER_BLOCKING: { |
| 767 file_user_blocking_thread_.reset(); | 787 TRACE_EVENT0("shutdown", |
| 788 "BrowserMainLoop::Subsystem:FileUserBlockingThread"); | |
| 789 file_user_blocking_thread_.reset(); | |
| 790 } | |
| 768 break; | 791 break; |
| 769 case BrowserThread::FILE: | 792 case BrowserThread::FILE: { |
| 793 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:FileThread"); | |
| 770 #if !defined(OS_IOS) | 794 #if !defined(OS_IOS) |
| 771 // Clean up state that lives on or uses the file_thread_ before | 795 // Clean up state that lives on or uses the file_thread_ before |
| 772 // it goes away. | 796 // it goes away. |
| 773 if (resource_dispatcher_host_) | 797 if (resource_dispatcher_host_) |
| 774 resource_dispatcher_host_.get()->save_file_manager()->Shutdown(); | 798 resource_dispatcher_host_.get()->save_file_manager()->Shutdown(); |
| 775 #endif // !defined(OS_IOS) | 799 #endif // !defined(OS_IOS) |
| 776 file_thread_.reset(); | 800 file_thread_.reset(); |
| 801 } | |
| 777 break; | 802 break; |
| 778 case BrowserThread::PROCESS_LAUNCHER: | 803 case BrowserThread::PROCESS_LAUNCHER: { |
| 779 process_launcher_thread_.reset(); | 804 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:LauncherThread"); |
| 805 process_launcher_thread_.reset(); | |
| 806 } | |
| 780 break; | 807 break; |
| 781 case BrowserThread::CACHE: | 808 case BrowserThread::CACHE: { |
| 782 cache_thread_.reset(); | 809 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:CacheThread"); |
| 810 cache_thread_.reset(); | |
| 811 } | |
| 783 break; | 812 break; |
| 784 case BrowserThread::IO: | 813 case BrowserThread::IO: { |
| 785 io_thread_.reset(); | 814 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:IOThread"); |
| 815 io_thread_.reset(); | |
| 816 } | |
| 786 break; | 817 break; |
| 787 case BrowserThread::UI: | 818 case BrowserThread::UI: |
| 788 case BrowserThread::ID_COUNT: | 819 case BrowserThread::ID_COUNT: |
| 789 default: | 820 default: |
| 790 NOTREACHED(); | 821 NOTREACHED(); |
| 791 break; | 822 break; |
| 792 } | 823 } |
| 793 } | 824 } |
| 794 | 825 |
| 795 #if !defined(OS_IOS) | 826 #if !defined(OS_IOS) |
| 796 indexed_db_thread_.reset(); | 827 { |
| 828 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:IndexedDBThread"); | |
| 829 indexed_db_thread_.reset(); | |
| 830 } | |
| 797 #endif | 831 #endif |
| 798 | 832 |
| 799 // Close the blocking I/O pool after the other threads. Other threads such | 833 // 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 | 834 // 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 | 835 // 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 | 836 // may also be slow operations pending that will blcok shutdown, so closing |
| 803 // it here (which will block until required operations are complete) gives | 837 // it here (which will block until required operations are complete) gives |
| 804 // more head start for those operations to finish. | 838 // more head start for those operations to finish. |
| 805 BrowserThreadImpl::ShutdownThreadPool(); | 839 { |
| 840 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:ThreadPool"); | |
| 841 BrowserThreadImpl::ShutdownThreadPool(); | |
| 842 } | |
| 806 | 843 |
| 807 #if !defined(OS_IOS) | 844 #if !defined(OS_IOS) |
| 808 // Must happen after the IO thread is shutdown since this may be accessed from | 845 // Must happen after the IO thread is shutdown since this may be accessed from |
| 809 // it. | 846 // it. |
| 810 BrowserGpuChannelHostFactory::Terminate(); | 847 { |
| 848 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:GPUChannelFactory"); | |
| 849 BrowserGpuChannelHostFactory::Terminate(); | |
| 850 } | |
| 811 | 851 |
| 812 // Must happen after the I/O thread is shutdown since this class lives on the | 852 // Must happen after the I/O thread is shutdown since this class lives on the |
| 813 // I/O thread and isn't threadsafe. | 853 // I/O thread and isn't threadsafe. |
| 814 GamepadService::GetInstance()->Terminate(); | 854 { |
| 815 DeviceInertialSensorService::GetInstance()->Shutdown(); | 855 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:GamepadService"); |
| 816 | 856 GamepadService::GetInstance()->Terminate(); |
| 817 URLDataManager::DeleteDataSources(); | 857 } |
| 858 { | |
| 859 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:SensorService"); | |
| 860 DeviceInertialSensorService::GetInstance()->Shutdown(); | |
| 861 } | |
| 862 { | |
| 863 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:DeleteDataSources"); | |
|
James Cook
2013/08/30 22:54:02
This seems like a lot of TRACE_EVENT macros in thi
Mr4D (OOO till 08-26)
2013/08/31 02:03:44
I was trying first to move that into the functions
| |
| 864 URLDataManager::DeleteDataSources(); | |
| 865 } | |
| 818 #endif // !defined(OS_IOS) | 866 #endif // !defined(OS_IOS) |
| 819 | 867 |
| 820 if (parts_) | 868 if (parts_) { |
| 869 TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:PostDestroyThreads"); | |
| 821 parts_->PostDestroyThreads(); | 870 parts_->PostDestroyThreads(); |
| 871 } | |
| 822 } | 872 } |
| 823 | 873 |
| 824 void BrowserMainLoop::InitializeMainThread() { | 874 void BrowserMainLoop::InitializeMainThread() { |
| 825 TRACE_EVENT0("startup", "BrowserMainLoop::InitializeMainThread") | 875 TRACE_EVENT0("startup", "BrowserMainLoop::InitializeMainThread") |
| 826 const char* kThreadName = "CrBrowserMain"; | 876 const char* kThreadName = "CrBrowserMain"; |
| 827 base::PlatformThread::SetName(kThreadName); | 877 base::PlatformThread::SetName(kThreadName); |
| 828 if (main_message_loop_) | 878 if (main_message_loop_) |
| 829 main_message_loop_->set_thread_name(kThreadName); | 879 main_message_loop_->set_thread_name(kThreadName); |
| 830 | 880 |
| 831 // Register the main thread by instantiating it, but don't call any methods. | 881 // 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 Loading... | |
| 989 if (parameters_.ui_task) | 1039 if (parameters_.ui_task) |
| 990 base::MessageLoopForUI::current()->PostTask(FROM_HERE, | 1040 base::MessageLoopForUI::current()->PostTask(FROM_HERE, |
| 991 *parameters_.ui_task); | 1041 *parameters_.ui_task); |
| 992 | 1042 |
| 993 base::RunLoop run_loop; | 1043 base::RunLoop run_loop; |
| 994 run_loop.Run(); | 1044 run_loop.Run(); |
| 995 #endif | 1045 #endif |
| 996 } | 1046 } |
| 997 | 1047 |
| 998 } // namespace content | 1048 } // namespace content |
| OLD | NEW |