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 |