Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(518)

Unified Diff: base/task_scheduler/delayed_task_manager.cc

Issue 2810873008: Separate the create and start phases in DelayedTaskManager. (Closed)
Patch Set: self-review Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698