blob: 417b4a09c37fce53a21e2e696eb8c63ebbe305a4 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/scheduler/browser_ui_thread_scheduler.h"
#include <utility>
#include "base/feature_list.h"
#include "base/logging.h"
#include "base/memory/ptr_util.h"
#include "base/message_loop/message_pump.h"
#include "base/message_loop/message_pump_type.h"
#include "base/process/process.h"
#include "base/run_loop.h"
#include "base/task/sequence_manager/sequence_manager.h"
#include "base/task/sequence_manager/sequence_manager_impl.h"
#include "base/task/sequence_manager/task_queue.h"
#include "base/task/sequence_manager/time_domain.h"
#include "base/threading/platform_thread.h"
#include "build/build_config.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/common/content_features.h"
namespace content {
BrowserUIThreadScheduler::~BrowserUIThreadScheduler() = default;
// static
std::unique_ptr<BrowserUIThreadScheduler>
BrowserUIThreadScheduler::CreateForTesting(
base::sequence_manager::SequenceManager* sequence_manager,
base::sequence_manager::TimeDomain* time_domain) {
return base::WrapUnique(
new BrowserUIThreadScheduler(sequence_manager, time_domain));
}
BrowserUIThreadScheduler::BrowserUIThreadScheduler()
: owned_sequence_manager_(
base::sequence_manager::CreateUnboundSequenceManager(
base::sequence_manager::SequenceManager::Settings::Builder()
.SetMessagePumpType(base::MessagePumpType::UI)
.SetAntiStarvationLogicForPrioritiesDisabled(true)
.Build())),
task_queues_(BrowserThread::UI,
owned_sequence_manager_.get(),
owned_sequence_manager_->GetRealTimeDomain()),
handle_(task_queues_.GetHandle()) {
CommonSequenceManagerSetup(owned_sequence_manager_.get());
owned_sequence_manager_->SetDefaultTaskRunner(
handle_->GetDefaultTaskRunner());
owned_sequence_manager_->BindToMessagePump(
base::MessagePump::Create(base::MessagePumpType::UI));
}
BrowserUIThreadScheduler::BrowserUIThreadScheduler(
base::sequence_manager::SequenceManager* sequence_manager,
base::sequence_manager::TimeDomain* time_domain)
: task_queues_(BrowserThread::UI, sequence_manager, time_domain),
handle_(task_queues_.GetHandle()) {
CommonSequenceManagerSetup(sequence_manager);
}
void BrowserUIThreadScheduler::CommonSequenceManagerSetup(
base::sequence_manager::SequenceManager* sequence_manager) {
sequence_manager_ = sequence_manager;
sequence_manager_->EnableCrashKeys("ui_scheduler_async_stack");
}
const scoped_refptr<base::SequencedTaskRunner>&
BrowserUIThreadScheduler::GetTaskRunnerForCurrentTask() const {
DCHECK(sequence_manager_);
return sequence_manager_->GetTaskRunnerForCurrentTask();
}
} // namespace content