Index: base/test/test_mock_time_task_runner.cc |
diff --git a/base/test/test_mock_time_task_runner.cc b/base/test/test_mock_time_task_runner.cc |
index f0ba9aa102c4f38d1a273762dad9b60e7b4a28fe..08d8766fe07fb6e13af4fa4232ac48d1f09c6914 100644 |
--- a/base/test/test_mock_time_task_runner.cc |
+++ b/base/test/test_mock_time_task_runner.cc |
@@ -74,46 +74,42 @@ Time MockClock::Now() { |
// Subclass of TestPendingTask which has a strictly monotonically increasing ID |
// for every task, so that tasks posted with the same 'time to run' can be run |
// in the order of being posted. |
-struct TestMockTimeTaskRunner::TestOrderedPendingTask |
- : public base::TestPendingTask { |
- TestOrderedPendingTask(); |
- TestOrderedPendingTask(const tracked_objects::Location& location, |
- const Closure& task, |
- TimeTicks post_time, |
- TimeDelta delay, |
- size_t ordinal, |
- TestNestability nestability); |
- ~TestOrderedPendingTask(); |
+struct TestMockTimeTaskRunner::TestOrderedPendingTaskInfo |
+ : public base::TestPendingTaskInfo { |
+ TestOrderedPendingTaskInfo(); |
+ TestOrderedPendingTaskInfo(const tracked_objects::Location& location, |
+ TimeTicks post_time, |
+ TimeDelta delay, |
+ size_t ordinal, |
+ TestNestability nestability); |
+ ~TestOrderedPendingTaskInfo(); |
size_t ordinal; |
}; |
-TestMockTimeTaskRunner::TestOrderedPendingTask::TestOrderedPendingTask() |
- : ordinal(0) { |
-} |
+TestMockTimeTaskRunner::TestOrderedPendingTaskInfo::TestOrderedPendingTaskInfo() |
+ : ordinal(0) {} |
-TestMockTimeTaskRunner::TestOrderedPendingTask::TestOrderedPendingTask( |
+TestMockTimeTaskRunner::TestOrderedPendingTaskInfo::TestOrderedPendingTaskInfo( |
const tracked_objects::Location& location, |
- const Closure& task, |
TimeTicks post_time, |
TimeDelta delay, |
size_t ordinal, |
TestNestability nestability) |
- : base::TestPendingTask(location, task, post_time, delay, nestability), |
- ordinal(ordinal) { |
-} |
+ : base::TestPendingTaskInfo(location, post_time, delay, nestability), |
+ ordinal(ordinal) {} |
-TestMockTimeTaskRunner::TestOrderedPendingTask::~TestOrderedPendingTask() { |
-} |
+TestMockTimeTaskRunner::TestOrderedPendingTaskInfo:: |
+ ~TestOrderedPendingTaskInfo() {} |
// TestMockTimeTaskRunner ----------------------------------------------------- |
bool TestMockTimeTaskRunner::TemporalOrder::operator()( |
- const TestOrderedPendingTask& first_task, |
- const TestOrderedPendingTask& second_task) const { |
+ const TestOrderedPendingTaskInfo& first_task, |
+ const TestOrderedPendingTaskInfo& second_task) const { |
if (first_task.GetTimeToRun() == second_task.GetTimeToRun()) |
- return first_task.ordinal > second_task.ordinal; |
- return first_task.GetTimeToRun() > second_task.GetTimeToRun(); |
+ return first_task.ordinal < second_task.ordinal; |
+ return first_task.GetTimeToRun() < second_task.GetTimeToRun(); |
} |
TestMockTimeTaskRunner::TestMockTimeTaskRunner() |
@@ -149,8 +145,7 @@ void TestMockTimeTaskRunner::FastForwardUntilNoTasksRemain() { |
void TestMockTimeTaskRunner::ClearPendingTasks() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
AutoLock scoped_lock(tasks_lock_); |
- while (!tasks_.empty()) |
- tasks_.pop(); |
+ tasks_.clear(); |
} |
Time TestMockTimeTaskRunner::Now() const { |
@@ -173,12 +168,11 @@ std::unique_ptr<TickClock> TestMockTimeTaskRunner::GetMockTickClock() const { |
return MakeUnique<MockTickClock>(this); |
} |
-std::deque<TestPendingTask> TestMockTimeTaskRunner::TakePendingTasks() { |
- std::deque<TestPendingTask> tasks; |
- while (!tasks_.empty()) { |
- tasks.push_back(tasks_.top()); |
- tasks_.pop(); |
- } |
+TestPendingTaskQueue TestMockTimeTaskRunner::TakePendingTasks() { |
+ TestPendingTaskQueue tasks; |
+ for (auto& task : tasks_) |
+ tasks.push_back(std::move(task)); |
+ tasks_.clear(); |
return tasks; |
} |
@@ -194,8 +188,11 @@ size_t TestMockTimeTaskRunner::GetPendingTaskCount() const { |
TimeDelta TestMockTimeTaskRunner::NextPendingTaskDelay() const { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- return tasks_.empty() ? TimeDelta::Max() |
- : tasks_.top().GetTimeToRun() - now_ticks_; |
+ if (tasks_.empty()) |
+ return TimeDelta::Max(); |
+ |
+ const TestPendingTaskInfo& task_info = tasks_.begin()->first; |
+ return task_info.GetTimeToRun() - now_ticks_; |
} |
bool TestMockTimeTaskRunner::RunsTasksOnCurrentThread() const { |
@@ -207,9 +204,11 @@ bool TestMockTimeTaskRunner::PostDelayedTask( |
const Closure& task, |
TimeDelta delay) { |
AutoLock scoped_lock(tasks_lock_); |
- tasks_.push(TestOrderedPendingTask(from_here, task, now_ticks_, delay, |
- next_task_ordinal_++, |
- TestPendingTask::NESTABLE)); |
+ |
+ TestOrderedPendingTaskInfo task_info(from_here, now_ticks_, delay, |
+ next_task_ordinal_++, |
+ TestPendingTaskInfo::NESTABLE); |
+ tasks_.insert(std::make_pair(task_info, task)); |
return true; |
} |
@@ -241,14 +240,15 @@ void TestMockTimeTaskRunner::ProcessAllTasksNoLaterThan(TimeDelta max_delta) { |
const TimeTicks original_now_ticks = now_ticks_; |
while (!IsElapsingStopped()) { |
OnBeforeSelectingTask(); |
- TestPendingTask task_info; |
- if (!DequeueNextTask(original_now_ticks, max_delta, &task_info)) |
+ TestPendingTaskInfo task_info; |
+ OnceClosure task; |
+ if (!DequeueNextTask(original_now_ticks, max_delta, &task_info, &task)) |
break; |
// If tasks were posted with a negative delay, task_info.GetTimeToRun() will |
// be less than |now_ticks_|. ForwardClocksUntilTickTime() takes care of not |
// moving the clock backwards in this case. |
ForwardClocksUntilTickTime(task_info.GetTimeToRun()); |
- task_info.task.Run(); |
+ std::move(task).Run(); |
OnAfterTaskRun(); |
} |
} |
@@ -262,17 +262,24 @@ void TestMockTimeTaskRunner::ForwardClocksUntilTickTime(TimeTicks later_ticks) { |
OnAfterTimePassed(); |
} |
-bool TestMockTimeTaskRunner::DequeueNextTask(const TimeTicks& reference, |
- const TimeDelta& max_delta, |
- TestPendingTask* next_task) { |
+bool TestMockTimeTaskRunner::DequeueNextTask( |
+ const TimeTicks& reference, |
+ const TimeDelta& max_delta, |
+ TestPendingTaskInfo* next_task_info, |
+ OnceClosure* next_task) { |
AutoLock scoped_lock(tasks_lock_); |
- if (!tasks_.empty() && |
- (tasks_.top().GetTimeToRun() - reference) <= max_delta) { |
- *next_task = tasks_.top(); |
- tasks_.pop(); |
- return true; |
- } |
- return false; |
+ if (tasks_.empty()) |
+ return false; |
+ |
+ auto itr = tasks_.begin(); |
+ const TestPendingTaskInfo& task_info = itr->first; |
+ if ((task_info.GetTimeToRun() - reference) > max_delta) |
+ return false; |
+ |
+ *next_task_info = task_info; |
+ *next_task = std::move(itr->second); |
+ tasks_.erase(itr); |
+ return true; |
} |
} // namespace base |