Index: media/cast/test/fake_single_thread_task_runner.cc |
diff --git a/media/cast/test/fake_single_thread_task_runner.cc b/media/cast/test/fake_single_thread_task_runner.cc |
index d2950fd9fb6df2efe7fa9799709e4ead88ce927c..dfdb6903fb8688a7e8e7a2edc09ca108fca96ce9 100644 |
--- a/media/cast/test/fake_single_thread_task_runner.cc |
+++ b/media/cast/test/fake_single_thread_task_runner.cc |
@@ -14,7 +14,8 @@ namespace test { |
FakeSingleThreadTaskRunner::FakeSingleThreadTaskRunner( |
base::SimpleTestTickClock* clock) |
- : clock_(clock) {} |
+ : clock_(clock), |
+ fail_on_next_task_(false) {} |
FakeSingleThreadTaskRunner::~FakeSingleThreadTaskRunner() {} |
@@ -22,6 +23,9 @@ bool FakeSingleThreadTaskRunner::PostDelayedTask( |
const tracked_objects::Location& from_here, |
const base::Closure& task, |
base::TimeDelta delay) { |
+ if (fail_on_next_task_) { |
+ LOG(FATAL) << "Infinite task-add loop detected."; |
+ } |
EXPECT_GE(delay, base::TimeDelta()); |
PostedTask posed_task(from_here, |
task, |
@@ -38,7 +42,7 @@ bool FakeSingleThreadTaskRunner::RunsTasksOnCurrentThread() const { |
} |
void FakeSingleThreadTaskRunner::RunTasks() { |
- while(true) { |
+ while (true) { |
// Run all tasks equal or older than current time. |
std::multimap<base::TimeTicks, PostedTask>::iterator it = tasks_.begin(); |
if (it == tasks_.end()) |
@@ -53,6 +57,31 @@ void FakeSingleThreadTaskRunner::RunTasks() { |
} |
} |
+void FakeSingleThreadTaskRunner::Sleep(base::TimeDelta t) { |
+ base::TimeTicks run_until = clock_->NowTicks() + t; |
+ while (1) { |
+ for (int i = 0; i < 100000; i++) { |
Alpha Left Google
2014/05/15 22:21:24
What is the constant used for? Please document.
hubbe
2014/05/16 04:31:10
Done.
|
+ // Run all tasks equal or older than current time. |
+ std::multimap<base::TimeTicks, PostedTask>::iterator it = tasks_.begin(); |
+ if (it == tasks_.end()) { |
+ clock_->Advance(run_until - clock_->NowTicks()); |
+ return; |
+ } |
+ |
+ PostedTask task = it->second; |
+ if (run_until < task.GetTimeToRun()) { |
+ clock_->Advance(run_until - clock_->NowTicks()); |
+ return; |
+ } |
+ |
+ clock_->Advance(task.GetTimeToRun() - clock_->NowTicks()); |
+ tasks_.erase(it); |
+ task.task.Run(); |
+ } |
+ fail_on_next_task_ = true; |
+ } |
+} |
+ |
bool FakeSingleThreadTaskRunner::PostNonNestableDelayedTask( |
const tracked_objects::Location& from_here, |
const base::Closure& task, |