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", |
| 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"); |
| 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 |