Chromium Code Reviews| 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..b60a1b12eafdfdf7b12952b567ec9b4ed2232a76 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,38 @@ void FakeSingleThreadTaskRunner::RunTasks() { |
| } |
| } |
| +void FakeSingleThreadTaskRunner::Sleep(base::TimeDelta t) { |
| + base::TimeTicks run_until = clock_->NowTicks() + t; |
| + while (1) { |
| + // If we run more than 100000 iterations, we've probably |
| + // hit some sort of case where a new task is posted every |
| + // time that we invoke a task, and we can't make progress |
| + // anymore. If that happens, set fail_on_next_task_ to true |
| + // and throw an error when the next task is posted. |
| + for (int i = 0; i < 100000; i++) { |
|
Alpha Left Google
2014/05/16 18:20:51
Do we actually run into this problem? It is suspic
hubbe
2014/05/16 18:24:56
I did because of a bug in SkewedSingleThreadTaskRu
|
| + // 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(); |
| + } |
| + // Instead of failing immediately, we fail when the next task is |
| + // added so that the backtrace will include the task that was added. |
| + fail_on_next_task_ = true; |
| + } |
| +} |
| + |
| bool FakeSingleThreadTaskRunner::PostNonNestableDelayedTask( |
| const tracked_objects::Location& from_here, |
| const base::Closure& task, |