Index: ash/mus/window_manager_application.cc |
diff --git a/ash/mus/window_manager_application.cc b/ash/mus/window_manager_application.cc |
index eae07e130d2e6929fe5446d29d9e953236268399..614722a09855dfa1c52b67590b40248fdbe1bb0c 100644 |
--- a/ash/mus/window_manager_application.cc |
+++ b/ash/mus/window_manager_application.cc |
@@ -83,6 +83,16 @@ WindowManagerApplication::~WindowManagerApplication() { |
// Destroy the WindowManager while still valid. This way we ensure |
// OnWillDestroyRootWindowController() is called (if it hasn't been already). |
window_manager_.reset(); |
+ |
+ if (blocking_pool_) { |
+ // Like BrowserThreadImpl, the goal is to make it impossible for ash to |
+ // 'infinite loop' during shutdown, but to reasonably expect that all |
+ // BLOCKING_SHUTDOWN tasks queued during shutdown get run. There's nothing |
+ // particularly scientific about the number chosen. |
+ const int kMaxNewShutdownBlockingTasks = 1000; |
+ blocking_pool_->Shutdown(kMaxNewShutdownBlockingTasks); |
+ } |
+ |
gpu_service_.reset(); |
#if defined(OS_CHROMEOS) |
statistics_provider_.reset(); |
@@ -96,7 +106,8 @@ void WindowManagerApplication::OnAcceleratorRegistrarDestroyed( |
} |
void WindowManagerApplication::InitWindowManager( |
- std::unique_ptr<ui::WindowTreeClient> window_tree_client) { |
+ std::unique_ptr<ui::WindowTreeClient> window_tree_client, |
+ const scoped_refptr<base::SequencedWorkerPool>& blocking_pool) { |
InitializeComponents(); |
#if defined(OS_CHROMEOS) |
// TODO(jamescook): Refactor StatisticsProvider so we can get just the data |
@@ -107,7 +118,7 @@ void WindowManagerApplication::InitWindowManager( |
statistics_provider_->SetMachineStatistic("initial_locale", "en-US"); |
statistics_provider_->SetMachineStatistic("keyboard_layout", ""); |
#endif |
- window_manager_->Init(std::move(window_tree_client)); |
+ window_manager_->Init(std::move(window_tree_client), blocking_pool); |
} |
void WindowManagerApplication::OnStart(const shell::Identity& identity) { |
@@ -131,7 +142,11 @@ void WindowManagerApplication::OnStart(const shell::Identity& identity) { |
native_widget_factory_mus_.reset( |
new NativeWidgetFactoryMus(window_manager_.get())); |
- InitWindowManager(std::move(window_tree_client)); |
+ const size_t kMaxNumberThreads = 3u; // Matches that of content. |
+ const char kThreadNamePrefix[] = "MashBlocking"; |
+ blocking_pool_ = new base::SequencedWorkerPool( |
+ kMaxNumberThreads, kThreadNamePrefix, base::TaskPriority::USER_VISIBLE); |
+ InitWindowManager(std::move(window_tree_client), blocking_pool_); |
} |
bool WindowManagerApplication::OnConnect(const shell::Identity& remote_identity, |