#include "gpu/command_buffer/service/scheduler_task_runner.h"
#include <utility>
#include <vector>
#include "base/auto_reset.h"
#include "base/check.h"
#include "base/functional/bind.h"
#include "gpu/command_buffer/common/sync_token.h"
#include "gpu/command_buffer/service/scheduler.h"
#include "third_party/abseil-cpp/absl/base/attributes.h"
namespace gpu {
namespace {
ABSL_CONST_INIT thread_local const SchedulerTaskRunner* current_task_runner =
nullptr;
}
SchedulerTaskRunner::SchedulerTaskRunner(Scheduler& scheduler,
SequenceId sequence_id)
: scheduler_(scheduler), sequence_id_(sequence_id) {}
SchedulerTaskRunner::~SchedulerTaskRunner() = default;
void SchedulerTaskRunner::ShutDown() {
base::AutoLock lock(lock_);
is_running_ = false;
}
bool SchedulerTaskRunner::PostDelayedTask(const base::Location& from_here,
base::OnceClosure task,
base::TimeDelta delay) {
return PostNonNestableDelayedTask(from_here, std::move(task), delay);
}
bool SchedulerTaskRunner::PostNonNestableDelayedTask(
const base::Location& from_here,
base::OnceClosure task,
base::TimeDelta delay) {
base::AutoLock lock(lock_);
if (!is_running_)
return false;
CHECK(delay.is_zero());
scheduler_->ScheduleTask(Scheduler::Task(
sequence_id_,
base::BindOnce(&SchedulerTaskRunner::RunTask, this, std::move(task)),
std::vector<SyncToken>()));
return true;
}
bool SchedulerTaskRunner::RunsTasksInCurrentSequence() const {
return current_task_runner &&
current_task_runner->sequence_id_ == sequence_id_;
}
void SchedulerTaskRunner::RunTask(base::OnceClosure task) {
{
base::AutoLock lock(lock_);
if (!is_running_)
return;
}
const base::AutoReset<const SchedulerTaskRunner*> resetter(
¤t_task_runner, this, nullptr);
std::move(task).Run();
}
}