Commit 3e27cb6e authored by robliao's avatar robliao Committed by Commit bot

Reland RedirectNonUINonIOBrowserThreads to TaskScheduler by default on trunk

This reverts commit f07732ec
(https://codereview.chromium.org/2791933004)
and reapplies b6d0c9a0
(https://codereview.chromium.org/2690183002/).

BUG=653916, 707986
TBR=jam@chromium.org, rkaplow@chromium.org
Previously reviewed at https://codereview.chromium.org/2690183002/

Review-Url: https://codereview.chromium.org/2856583002
Cr-Commit-Position: refs/heads/master@{#468376}
parent f00f17c2
...@@ -34,9 +34,11 @@ class Predictor; ...@@ -34,9 +34,11 @@ class Predictor;
namespace content { namespace content {
class BrowserGpuChannelHostFactory; class BrowserGpuChannelHostFactory;
class BrowserGpuMemoryBufferManager; class BrowserGpuMemoryBufferManager;
class BrowserMainLoop;
class BrowserShutdownProfileDumper; class BrowserShutdownProfileDumper;
class BrowserSurfaceViewManager; class BrowserSurfaceViewManager;
class BrowserTestBase; class BrowserTestBase;
class CategorizedWorkerPool;
class NestedMessagePumpAndroid; class NestedMessagePumpAndroid;
class ScopedAllowWaitForAndroidLayoutTests; class ScopedAllowWaitForAndroidLayoutTests;
class ScopedAllowWaitForDebugURL; class ScopedAllowWaitForDebugURL;
...@@ -45,7 +47,6 @@ class SynchronousCompositor; ...@@ -45,7 +47,6 @@ class SynchronousCompositor;
class SynchronousCompositorBrowserFilter; class SynchronousCompositorBrowserFilter;
class SynchronousCompositorHost; class SynchronousCompositorHost;
class TextInputClientMac; class TextInputClientMac;
class CategorizedWorkerPool;
} // namespace content } // namespace content
namespace dbus { namespace dbus {
class Bus; class Bus;
...@@ -185,6 +186,7 @@ class BASE_EXPORT ThreadRestrictions { ...@@ -185,6 +186,7 @@ class BASE_EXPORT ThreadRestrictions {
friend class android_webview::AwFormDatabaseService; friend class android_webview::AwFormDatabaseService;
friend class android_webview::CookieManager; friend class android_webview::CookieManager;
friend class base::StackSamplingProfiler; friend class base::StackSamplingProfiler;
friend class content::BrowserMainLoop;
friend class content::BrowserShutdownProfileDumper; friend class content::BrowserShutdownProfileDumper;
friend class content::BrowserSurfaceViewManager; friend class content::BrowserSurfaceViewManager;
friend class content::BrowserTestBase; friend class content::BrowserTestBase;
......
...@@ -1259,86 +1259,88 @@ void BrowserMainLoop::ShutdownThreadsAndCleanUp() { ...@@ -1259,86 +1259,88 @@ void BrowserMainLoop::ShutdownThreadsAndCleanUp() {
service_manager_context_.reset(); service_manager_context_.reset();
mojo_ipc_support_.reset(); mojo_ipc_support_.reset();
// Must be size_t so we can subtract from it. {
for (size_t thread_id = BrowserThread::ID_COUNT - 1; base::ThreadRestrictions::ScopedAllowWait allow_wait_for_join;
thread_id >= (BrowserThread::UI + 1);
--thread_id) { // Must be size_t so we can subtract from it.
// Find the thread object we want to stop. Looping over all valid for (size_t thread_id = BrowserThread::ID_COUNT - 1;
// BrowserThread IDs and DCHECKing on a missing case in the switch thread_id >= (BrowserThread::UI + 1); --thread_id) {
// statement helps avoid a mismatch between this code and the // Find the thread object we want to stop. Looping over all valid
// BrowserThread::ID enumeration. // BrowserThread IDs and DCHECKing on a missing case in the switch
// // statement helps avoid a mismatch between this code and the
// The destruction order is the reverse order of occurrence in the // BrowserThread::ID enumeration.
// BrowserThread::ID list. The rationale for the order is as //
// follows (need to be filled in a bit): // The destruction order is the reverse order of occurrence in the
// // BrowserThread::ID list. The rationale for the order is as follows (need
// // to be filled in a bit):
// - The IO thread is the only user of the CACHE thread. //
// // - The IO thread is the only user of the CACHE thread.
// - The PROCESS_LAUNCHER thread must be stopped after IO in case //
// the IO thread posted a task to terminate a process on the // - The PROCESS_LAUNCHER thread must be stopped after IO in case
// process launcher thread. // the IO thread posted a task to terminate a process on the
// // process launcher thread.
// - (Not sure why DB stops last.) //
switch (thread_id) { // - (Not sure why DB stops last.)
case BrowserThread::DB: { switch (thread_id) {
TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:DBThread"); case BrowserThread::DB: {
ResetThread_DB(std::move(db_thread_)); TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:DBThread");
break; ResetThread_DB(std::move(db_thread_));
} break;
case BrowserThread::FILE: { }
TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:FileThread"); case BrowserThread::FILE: {
// Clean up state that lives on or uses the FILE thread before it goes TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:FileThread");
// away. // Clean up state that lives on or uses the FILE thread before it goes
save_file_manager_->Shutdown(); // away.
ResetThread_FILE(std::move(file_thread_)); save_file_manager_->Shutdown();
break; ResetThread_FILE(std::move(file_thread_));
} break;
case BrowserThread::FILE_USER_BLOCKING: { }
TRACE_EVENT0("shutdown", case BrowserThread::FILE_USER_BLOCKING: {
"BrowserMainLoop::Subsystem:FileUserBlockingThread"); TRACE_EVENT0("shutdown",
ResetThread_FILE_USER_BLOCKING(std::move(file_user_blocking_thread_)); "BrowserMainLoop::Subsystem:FileUserBlockingThread");
break; ResetThread_FILE_USER_BLOCKING(std::move(file_user_blocking_thread_));
} break;
case BrowserThread::PROCESS_LAUNCHER: { }
TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:LauncherThread"); case BrowserThread::PROCESS_LAUNCHER: {
ResetThread_PROCESS_LAUNCHER(std::move(process_launcher_thread_)); TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:LauncherThread");
break; ResetThread_PROCESS_LAUNCHER(std::move(process_launcher_thread_));
} break;
case BrowserThread::CACHE: { }
TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:CacheThread"); case BrowserThread::CACHE: {
ResetThread_CACHE(std::move(cache_thread_)); TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:CacheThread");
break; ResetThread_CACHE(std::move(cache_thread_));
} break;
case BrowserThread::IO: { }
TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:IOThread"); case BrowserThread::IO: {
ResetThread_IO(std::move(io_thread_)); TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:IOThread");
break; ResetThread_IO(std::move(io_thread_));
break;
}
case BrowserThread::UI:
case BrowserThread::ID_COUNT:
NOTREACHED();
break;
} }
case BrowserThread::UI:
case BrowserThread::ID_COUNT:
NOTREACHED();
break;
} }
} {
{ TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:IndexedDBThread");
TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:IndexedDBThread"); ResetThread_IndexedDb(std::move(indexed_db_thread_));
ResetThread_IndexedDb(std::move(indexed_db_thread_)); }
}
// Close the blocking I/O pool after the other threads. Other threads such // Close the blocking I/O pool after the other threads. Other threads such
// as the I/O thread may need to schedule work like closing files or flushing // as the I/O thread may need to schedule work like closing files or
// data during shutdown, so the blocking pool needs to be available. There // flushing data during shutdown, so the blocking pool needs to be
// may also be slow operations pending that will blcok shutdown, so closing // available. There may also be slow operations pending that will blcok
// it here (which will block until required operations are complete) gives // shutdown, so closing it here (which will block until required operations
// more head start for those operations to finish. // are complete) gives more head start for those operations to finish.
{ {
TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:ThreadPool"); TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:ThreadPool");
BrowserThreadImpl::ShutdownThreadPool(); BrowserThreadImpl::ShutdownThreadPool();
} }
{ {
TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:TaskScheduler"); TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:TaskScheduler");
base::TaskScheduler::GetInstance()->Shutdown(); base::TaskScheduler::GetInstance()->Shutdown();
}
} }
// Must happen after the IO thread is shutdown since this may be accessed from // Must happen after the IO thread is shutdown since this may be accessed from
......
...@@ -365,6 +365,7 @@ ...@@ -365,6 +365,7 @@
{ {
"name": "Default", "name": "Default",
"params": { "params": {
"RedirectNonUINonIOBrowserThreads": "true",
"RedirectSequencedWorkerPools": "true" "RedirectSequencedWorkerPools": "true"
} }
}, },
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment