blob: 20a5910b47b70a75358bb5d22b6b43b0a0be1f30 [file] [log] [blame]
// Copyright 2016 The Fuchsia 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 "topaz/lib/deprecated_loop/incoming_task_queue.h"
namespace deprecated_loop {
namespace internal {
TaskQueueDelegate::~TaskQueueDelegate() {}
IncomingTaskQueue::IncomingTaskQueue() {}
IncomingTaskQueue::~IncomingTaskQueue() {}
void IncomingTaskQueue::PostTask(fxl::Closure task) {
AddTask(std::move(task), fxl::TimePoint());
}
void IncomingTaskQueue::PostTaskForTime(fxl::Closure task,
fxl::TimePoint target_time) {
AddTask(std::move(task), target_time);
}
void IncomingTaskQueue::PostDelayedTask(fxl::Closure task,
fxl::TimeDelta delay) {
AddTask(std::move(task), delay > fxl::TimeDelta::Zero()
? fxl::TimePoint::Now() + delay
: fxl::TimePoint());
}
void IncomingTaskQueue::AddTask(fxl::Closure task, fxl::TimePoint target_time) {
std::lock_guard<std::mutex> locker(mutex_);
if (drop_incoming_tasks_)
return;
if (delegate_) {
delegate_->PostTask(std::move(task), target_time);
} else {
incoming_queue_.emplace_back(std::move(task), target_time);
}
}
bool IncomingTaskQueue::RunsTasksOnCurrentThread() {
std::lock_guard<std::mutex> locker(mutex_);
return delegate_ && delegate_->RunsTasksOnCurrentThread();
}
void IncomingTaskQueue::InitDelegate(TaskQueueDelegate* delegate) {
FXL_DCHECK(delegate);
std::lock_guard<std::mutex> locker(mutex_);
FXL_DCHECK(!drop_incoming_tasks_);
delegate_ = delegate;
for (auto& task : incoming_queue_)
delegate_->PostTask(std::move(task.first), task.second);
incoming_queue_.clear();
}
void IncomingTaskQueue::ClearDelegate() {
std::lock_guard<std::mutex> locker(mutex_);
FXL_DCHECK(!drop_incoming_tasks_);
drop_incoming_tasks_ = true;
delegate_ = nullptr;
}
} // namespace internal
} // namespace deprecated_loop