| Index: base/task_scheduler/delayed_task_manager.cc
|
| diff --git a/base/task_scheduler/delayed_task_manager.cc b/base/task_scheduler/delayed_task_manager.cc
|
| index 420f8937f8bac38d0a99b21961f672964978dfa6..f40f3296a58bd8fb64a3d23365ee8bb4d32afb4c 100644
|
| --- a/base/task_scheduler/delayed_task_manager.cc
|
| +++ b/base/task_scheduler/delayed_task_manager.cc
|
| @@ -4,7 +4,7 @@
|
|
|
| #include "base/task_scheduler/delayed_task_manager.h"
|
|
|
| -#include <utility>
|
| +#include <algorithm>
|
|
|
| #include "base/bind.h"
|
| #include "base/logging.h"
|
| @@ -14,27 +14,51 @@
|
| namespace base {
|
| namespace internal {
|
|
|
| -DelayedTaskManager::DelayedTaskManager(
|
| - scoped_refptr<TaskRunner> service_thread_task_runner)
|
| - : service_thread_task_runner_(std::move(service_thread_task_runner)) {
|
| - DCHECK(service_thread_task_runner_);
|
| -}
|
| -
|
| +DelayedTaskManager::DelayedTaskManager() = default;
|
| DelayedTaskManager::~DelayedTaskManager() = default;
|
|
|
| +void DelayedTaskManager::Start(
|
| + scoped_refptr<TaskRunner> service_thread_task_runner) {
|
| + AutoSchedulerLock auto_lock(lock_);
|
| + DCHECK(service_thread_task_runner);
|
| + DCHECK(!service_thread_task_runner_);
|
| + service_thread_task_runner_ = std::move(service_thread_task_runner);
|
| +
|
| + const TimeTicks now = TimeTicks::Now();
|
| + for (auto& task_and_callback : tasks_added_before_start_) {
|
| + const TimeDelta delay =
|
| + std::max(TimeDelta(), task_and_callback.first->delayed_run_time - now);
|
| + service_thread_task_runner_->PostDelayedTask(
|
| + FROM_HERE,
|
| + BindOnce(std::move(task_and_callback.second),
|
| + Passed(std::move(task_and_callback.first))),
|
| + delay);
|
| + }
|
| + tasks_added_before_start_.clear();
|
| +}
|
| +
|
| void DelayedTaskManager::AddDelayedTask(
|
| std::unique_ptr<Task> task,
|
| - const PostTaskNowCallback& post_task_now_callback) {
|
| + PostTaskNowCallback post_task_now_callback) {
|
| DCHECK(task);
|
| DCHECK(task->task);
|
|
|
| const TimeDelta delay = task->delay;
|
| DCHECK(!delay.is_zero());
|
|
|
| - // TODO(fdoray): Use |task->delayed_run_time| on the service thread
|
| - // MessageLoop rather than recomputing it from |delay|.
|
| - service_thread_task_runner_->PostDelayedTask(
|
| - FROM_HERE, Bind(post_task_now_callback, Passed(std::move(task))), delay);
|
| + AutoSchedulerLock auto_lock(lock_);
|
| +
|
| + if (service_thread_task_runner_) {
|
| + // TODO(fdoray): Use |task->delayed_run_time| on the service thread
|
| + // MessageLoop rather than recomputing it from |delay|.
|
| + service_thread_task_runner_->PostDelayedTask(
|
| + FROM_HERE,
|
| + BindOnce(std::move(post_task_now_callback), Passed(std::move(task))),
|
| + delay);
|
| + } else {
|
| + tasks_added_before_start_.push_back(
|
| + {std::move(task), std::move(post_task_now_callback)});
|
| + }
|
| }
|
|
|
| } // namespace internal
|
|
|