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

Unified Diff: base/test/test_simple_task_runner.cc

Issue 2296923003: Make TestSimpleTaskRunner thread-safe. (Closed)
Patch Set: fix asan error Created 4 years, 3 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/test/test_simple_task_runner.cc
diff --git a/base/test/test_simple_task_runner.cc b/base/test/test_simple_task_runner.cc
index cc39fab85ad3ecb8b1d7ee5f8d591a0f3669159b..cabd83c56cfd53411c067ea343c90ae51bfc068f 100644
--- a/base/test/test_simple_task_runner.cc
+++ b/base/test/test_simple_task_runner.cc
@@ -8,17 +8,15 @@
namespace base {
-TestSimpleTaskRunner::TestSimpleTaskRunner() {}
+TestSimpleTaskRunner::TestSimpleTaskRunner() = default;
-TestSimpleTaskRunner::~TestSimpleTaskRunner() {
- DCHECK(thread_checker_.CalledOnValidThread());
-}
+TestSimpleTaskRunner::~TestSimpleTaskRunner() = default;
bool TestSimpleTaskRunner::PostDelayedTask(
const tracked_objects::Location& from_here,
const Closure& task,
TimeDelta delay) {
- DCHECK(thread_checker_.CalledOnValidThread());
+ AutoLock auto_lock(lock_);
pending_tasks_.push_back(
TestPendingTask(from_here, task, TimeTicks(), delay,
TestPendingTask::NESTABLE));
@@ -29,7 +27,7 @@ bool TestSimpleTaskRunner::PostNonNestableDelayedTask(
const tracked_objects::Location& from_here,
const Closure& task,
TimeDelta delay) {
- DCHECK(thread_checker_.CalledOnValidThread());
+ AutoLock auto_lock(lock_);
pending_tasks_.push_back(
TestPendingTask(from_here, task, TimeTicks(), delay,
TestPendingTask::NON_NESTABLE));
@@ -37,40 +35,46 @@ bool TestSimpleTaskRunner::PostNonNestableDelayedTask(
}
bool TestSimpleTaskRunner::RunsTasksOnCurrentThread() const {
- DCHECK(thread_checker_.CalledOnValidThread());
- return true;
+ return thread_ref_ == PlatformThread::CurrentRef();
}
-const std::deque<TestPendingTask>&
-TestSimpleTaskRunner::GetPendingTasks() const {
- DCHECK(thread_checker_.CalledOnValidThread());
+std::deque<TestPendingTask> TestSimpleTaskRunner::GetPendingTasks() const {
+ AutoLock auto_lock(lock_);
return pending_tasks_;
}
+size_t TestSimpleTaskRunner::NumPendingTasks() const {
+ AutoLock auto_lock(lock_);
+ return pending_tasks_.size();
+}
+
bool TestSimpleTaskRunner::HasPendingTask() const {
- DCHECK(thread_checker_.CalledOnValidThread());
+ AutoLock auto_lock(lock_);
return !pending_tasks_.empty();
}
base::TimeDelta TestSimpleTaskRunner::NextPendingTaskDelay() const {
- DCHECK(thread_checker_.CalledOnValidThread());
+ AutoLock auto_lock(lock_);
return pending_tasks_.front().GetTimeToRun() - base::TimeTicks();
}
void TestSimpleTaskRunner::ClearPendingTasks() {
- DCHECK(thread_checker_.CalledOnValidThread());
+ AutoLock auto_lock(lock_);
pending_tasks_.clear();
}
void TestSimpleTaskRunner::RunPendingTasks() {
- DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(RunsTasksOnCurrentThread());
+
// Swap with a local variable to avoid re-entrancy problems.
std::deque<TestPendingTask> tasks_to_run;
- tasks_to_run.swap(pending_tasks_);
- for (std::deque<TestPendingTask>::iterator it = tasks_to_run.begin();
- it != tasks_to_run.end(); ++it) {
- it->task.Run();
+ {
+ AutoLock auto_lock(lock_);
+ tasks_to_run.swap(pending_tasks_);
}
+
+ for (const auto& task : tasks_to_run)
+ task.task.Run();
}
void TestSimpleTaskRunner::RunUntilIdle() {

Powered by Google App Engine
This is Rietveld 408576698