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

Unified Diff: base/timer/timer.cc

Issue 637983003: Add support to base::Timer for custom task runners. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update for review feedback Created 6 years, 2 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/timer/timer.cc
diff --git a/base/timer/timer.cc b/base/timer/timer.cc
index 1916ccc34ebb7c7bf328533ba8911ddd11679b17..8e41215ecf8e4278b6608c628da0dc238c9054b9 100644
--- a/base/timer/timer.cc
+++ b/base/timer/timer.cc
@@ -8,7 +8,6 @@
#include "base/logging.h"
#include "base/memory/ref_counted.h"
-#include "base/single_thread_task_runner.h"
#include "base/thread_task_runner_handle.h"
#include "base/threading/platform_thread.h"
@@ -93,6 +92,12 @@ TimeDelta Timer::GetCurrentDelay() const {
return delay_;
}
+void Timer::SetTaskRunner(scoped_refptr<SingleThreadTaskRunner> task_runner) {
+ // Do not allow changing the task runner once something has been scheduled.
+ DCHECK(scheduled_task_ == NULL && thread_id_ == 0);
danakj 2014/10/16 17:14:59 these are 2 DCHECKs, split them up (or isn't check
Avi (use Gerrit) 2014/10/16 18:02:55 Yep. Two DCHECK_EQs, and nullptr.
petrcermak 2014/10/17 15:43:15 Done. I kept both checks since thread_id is set on
+ task_runner_ = task_runner;
danakj 2014/10/16 17:14:59 task_runner has a reference already, swap it into
petrcermak 2014/10/17 15:43:15 Done.
+}
+
void Timer::Start(const tracked_objects::Location& posted_from,
TimeDelta delay,
const base::Closure& user_task) {
@@ -146,12 +151,12 @@ void Timer::PostNewScheduledTask(TimeDelta delay) {
is_running_ = true;
scheduled_task_ = new BaseTimerTaskInternal(this);
if (delay > TimeDelta::FromMicroseconds(0)) {
- ThreadTaskRunnerHandle::Get()->PostDelayedTask(posted_from_,
+ GetTaskRunner()->PostDelayedTask(posted_from_,
base::Bind(&BaseTimerTaskInternal::Run, base::Owned(scheduled_task_)),
delay);
scheduled_run_time_ = desired_run_time_ = TimeTicks::Now() + delay;
} else {
- ThreadTaskRunnerHandle::Get()->PostTask(posted_from_,
+ GetTaskRunner()->PostTask(posted_from_,
base::Bind(&BaseTimerTaskInternal::Run, base::Owned(scheduled_task_)));
scheduled_run_time_ = desired_run_time_ = TimeTicks();
}
@@ -161,6 +166,13 @@ void Timer::PostNewScheduledTask(TimeDelta delay) {
thread_id_ = static_cast<int>(PlatformThread::CurrentId());
}
+scoped_refptr<SingleThreadTaskRunner> Timer::GetTaskRunner() {
+ if (task_runner_.get() == NULL) {
Avi (use Gerrit) 2014/10/16 18:02:55 nullptr?
petrcermak 2014/10/17 15:43:15 Done.
+ task_runner_ = ThreadTaskRunnerHandle::Get();
danakj 2014/10/16 17:14:59 This will make Timer hold a ref on the current tas
petrcermak 2014/10/17 15:43:15 Done. I did this initially but I was told to store
+ }
+ return task_runner_;
+}
+
void Timer::AbandonScheduledTask() {
DCHECK(thread_id_ == 0 ||
thread_id_ == static_cast<int>(PlatformThread::CurrentId()));

Powered by Google App Engine
This is Rietveld 408576698