blob: d905bfc6327c3c492ba469151421ff301ad51a1a [file] [log] [blame]
// Copyright 2015 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 "third_party/blink/renderer/platform/scheduler/common/scheduler_helper.h"
#include "base/time/default_tick_clock.h"
#include "base/trace_event/trace_event.h"
#include "base/trace_event/trace_event_argument.h"
#include "third_party/blink/renderer/platform/scheduler/base/task_queue_impl.h"
namespace blink {
namespace scheduler {
SchedulerHelper::SchedulerHelper(
std::unique_ptr<TaskQueueManager> task_queue_manager)
: task_queue_manager_(std::move(task_queue_manager)), observer_(nullptr) {
task_queue_manager_->SetWorkBatchSize(4);
}
void SchedulerHelper::InitDefaultQueues(
scoped_refptr<TaskQueue> default_task_queue,
scoped_refptr<TaskQueue> control_task_queue) {
control_task_queue->SetQueuePriority(TaskQueue::kControlPriority);
DCHECK(task_queue_manager_);
task_queue_manager_->SetDefaultTaskRunner(default_task_queue);
}
SchedulerHelper::~SchedulerHelper() {
Shutdown();
}
void SchedulerHelper::Shutdown() {
CheckOnValidThread();
if (!task_queue_manager_)
return;
task_queue_manager_->SetObserver(nullptr);
task_queue_manager_.reset();
}
void SchedulerHelper::SetWorkBatchSizeForTesting(size_t work_batch_size) {
CheckOnValidThread();
DCHECK(task_queue_manager_.get());
task_queue_manager_->SetWorkBatchSize(work_batch_size);
}
bool SchedulerHelper::GetAndClearSystemIsQuiescentBit() {
CheckOnValidThread();
DCHECK(task_queue_manager_.get());
return task_queue_manager_->GetAndClearSystemIsQuiescentBit();
}
void SchedulerHelper::AddTaskObserver(
base::MessageLoop::TaskObserver* task_observer) {
CheckOnValidThread();
if (task_queue_manager_)
task_queue_manager_->AddTaskObserver(task_observer);
}
void SchedulerHelper::RemoveTaskObserver(
base::MessageLoop::TaskObserver* task_observer) {
CheckOnValidThread();
if (task_queue_manager_)
task_queue_manager_->RemoveTaskObserver(task_observer);
}
void SchedulerHelper::AddTaskTimeObserver(
TaskTimeObserver* task_time_observer) {
if (task_queue_manager_)
task_queue_manager_->AddTaskTimeObserver(task_time_observer);
}
void SchedulerHelper::RemoveTaskTimeObserver(
TaskTimeObserver* task_time_observer) {
if (task_queue_manager_)
task_queue_manager_->RemoveTaskTimeObserver(task_time_observer);
}
void SchedulerHelper::SetObserver(Observer* observer) {
CheckOnValidThread();
observer_ = observer;
DCHECK(task_queue_manager_);
task_queue_manager_->SetObserver(this);
}
void SchedulerHelper::SweepCanceledDelayedTasks() {
CheckOnValidThread();
DCHECK(task_queue_manager_);
task_queue_manager_->SweepCanceledDelayedTasks();
}
RealTimeDomain* SchedulerHelper::real_time_domain() const {
CheckOnValidThread();
DCHECK(task_queue_manager_);
return task_queue_manager_->GetRealTimeDomain();
}
void SchedulerHelper::RegisterTimeDomain(TimeDomain* time_domain) {
CheckOnValidThread();
DCHECK(task_queue_manager_);
task_queue_manager_->RegisterTimeDomain(time_domain);
}
void SchedulerHelper::UnregisterTimeDomain(TimeDomain* time_domain) {
CheckOnValidThread();
if (task_queue_manager_)
task_queue_manager_->UnregisterTimeDomain(time_domain);
}
void SchedulerHelper::OnBeginNestedRunLoop() {
if (observer_)
observer_->OnBeginNestedRunLoop();
}
void SchedulerHelper::OnExitNestedRunLoop() {
if (observer_)
observer_->OnExitNestedRunLoop();
}
const base::TickClock* SchedulerHelper::GetClock() const {
return task_queue_manager_->GetClock();
}
base::TimeTicks SchedulerHelper::NowTicks() const {
if (task_queue_manager_)
return task_queue_manager_->NowTicks();
// We may need current time for tracing when shutting down worker thread.
return base::TimeTicks::Now();
}
} // namespace scheduler
} // namespace blink