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

Unified Diff: cc/resources/worker_pool_unittest.cc

Issue 73923003: Shared Raster Worker Threads (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: cc_unittest, cc_perftest changes + unit test + nits Created 6 years, 11 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: cc/resources/worker_pool_unittest.cc
diff --git a/cc/resources/worker_pool_unittest.cc b/cc/resources/worker_pool_unittest.cc
old mode 100644
new mode 100755
index f7c5a951df6de92dffb4b344f2fce408b06f3298..8f3f831c4b75387f43487b714f546f4d231093b9
--- a/cc/resources/worker_pool_unittest.cc
+++ b/cc/resources/worker_pool_unittest.cc
@@ -60,7 +60,7 @@ class FakeWorkerPool : public WorkerPool {
unsigned dependent_count;
unsigned priority;
};
- FakeWorkerPool() : WorkerPool(1, "test") {}
+ FakeWorkerPool() : WorkerPool() {}
virtual ~FakeWorkerPool() {}
static scoped_ptr<FakeWorkerPool> Create() {
@@ -80,6 +80,8 @@ class FakeWorkerPool : public WorkerPool {
scoped_ptr<internal::GraphNode> completion_node(
new internal::GraphNode(new_completion_task.get(), 0u));
+
+
reveman 2014/01/09 16:04:26 no need to add these 2 blank lines
sohanjg 2014/01/10 15:12:31 Done.
for (std::vector<Task>::const_iterator it = tasks.begin();
it != tasks.end(); ++it) {
scoped_refptr<FakeWorkerPoolTaskImpl> new_task(
@@ -108,9 +110,7 @@ class FakeWorkerPool : public WorkerPool {
new_graph.set(new_completion_task.get(), completion_node.Pass());
scheduled_tasks_completion_.reset(new CompletionEvent);
-
reveman 2014/01/09 16:04:26 no need to remove this blank line
sohanjg 2014/01/10 15:12:31 Done.
SetTaskGraph(&new_graph);
-
reveman 2014/01/09 16:04:26 no need to remove this blank line
sohanjg 2014/01/10 15:12:31 Done.
dependents_.swap(new_dependents);
completion_task_.swap(new_completion_task);
tasks_.swap(new_tasks);
@@ -389,6 +389,230 @@ TEST_F(WorkerPoolTest, Priority) {
EXPECT_EQ(0u, on_task_completed_ids()[2]);
}
+TEST_F(WorkerPoolTest, MultipleWorkerPoolBasic) {
+ ResetIds();
+
+ EXPECT_EQ(0u, run_task_ids().size());
+ EXPECT_EQ(0u, on_task_completed_ids().size());
+
+ // Setup multiple workerpool.
+ scoped_ptr<FakeWorkerPool>worker_pool1 = FakeWorkerPool::Create();
+ scoped_ptr<FakeWorkerPool>worker_pool2 = FakeWorkerPool::Create();
+ scoped_ptr<FakeWorkerPool>worker_pool3 = FakeWorkerPool::Create();
+
+ worker_pool1->ScheduleTasks(
+ std::vector<FakeWorkerPool::Task>(
+ 1,
+ FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask,
+ base::Unretained(this),
+ 0u),
+ base::Bind(&WorkerPoolTest::OnTaskCompleted,
+ base::Unretained(this),
+ 0u),
+ base::Closure(),
+ 1u,
+ 0u)));
+ worker_pool1->WaitForTasksToComplete();
+ worker_pool1->CheckForCompletedTasks();
+
+ EXPECT_EQ(1u, run_task_ids().size());
+ EXPECT_EQ(1u, on_task_completed_ids().size());
+
+ worker_pool2->ScheduleTasks(
+ std::vector<FakeWorkerPool::Task>(
+ 1,
+ FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask,
+ base::Unretained(this),
+ 0u),
+ base::Bind(&WorkerPoolTest::OnTaskCompleted,
+ base::Unretained(this),
+ 0u),
+ base::Bind(&WorkerPoolTest::RunTask,
+ base::Unretained(this),
+ 0u),
+ 1u,
+ 0u)));
+
+ worker_pool2->WaitForTasksToComplete();
+ worker_pool2->CheckForCompletedTasks();
+
+ EXPECT_EQ(3u, run_task_ids().size());
+ EXPECT_EQ(2u, on_task_completed_ids().size());
+
+ worker_pool3->ScheduleTasks(
+ std::vector<FakeWorkerPool::Task>(
+ 1, FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask,
+ base::Unretained(this),
+ 0u),
+ base::Bind(&WorkerPoolTest::OnTaskCompleted,
+ base::Unretained(this),
+ 0u),
+ base::Bind(&WorkerPoolTest::RunTask,
+ base::Unretained(this),
+ 0u),
+ 2u,
+ 0u)));
+ worker_pool3->WaitForTasksToComplete();
+ worker_pool3->CheckForCompletedTasks();
+
+ EXPECT_EQ(6u, run_task_ids().size());
+ EXPECT_EQ(3u, on_task_completed_ids().size());
+}
+
+TEST_F(WorkerPoolTest, MultipleWorkerPoolDependencies) {
+ // Setup multiple workerpool.
+ scoped_ptr<FakeWorkerPool>worker_pool1 = FakeWorkerPool::Create();
+ scoped_ptr<FakeWorkerPool>worker_pool2 = FakeWorkerPool::Create();
+
+ worker_pool1->ScheduleTasks(
+ std::vector<FakeWorkerPool::Task>(
+ 1, FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask,
+ base::Unretained(this),
+ 0u),
+ base::Bind(&WorkerPoolTest::OnTaskCompleted,
+ base::Unretained(this),
+ 0u),
+ base::Bind(&WorkerPoolTest::RunTask,
+ base::Unretained(this),
+ 1u),
+ 1u,
+ 0u)));
+ worker_pool1->WaitForTasksToComplete();
+ worker_pool1->CheckForCompletedTasks();
+
+ // Check if task ran before dependent.
+ ASSERT_EQ(2u, run_task_ids().size());
+ EXPECT_EQ(0u, run_task_ids()[0]);
+ EXPECT_EQ(1u, run_task_ids()[1]);
+ ASSERT_EQ(1u, on_task_completed_ids().size());
+ EXPECT_EQ(0u, on_task_completed_ids()[0]);
+
+ worker_pool2->ScheduleTasks(
+ std::vector<FakeWorkerPool::Task>(
+ 1, FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask,
+ base::Unretained(this),
+ 2u),
+ base::Bind(&WorkerPoolTest::OnTaskCompleted,
+ base::Unretained(this),
+ 2u),
+ base::Bind(&WorkerPoolTest::RunTask,
+ base::Unretained(this),
+ 3u),
+ 2u,
+ 0u)));
+ worker_pool2->WaitForTasksToComplete();
+ worker_pool2->CheckForCompletedTasks();
+
+ // Task should only run once.
+ ASSERT_EQ(5u, run_task_ids().size());
+ EXPECT_EQ(2u, run_task_ids()[2]);
+ EXPECT_EQ(3u, run_task_ids()[3]);
+ EXPECT_EQ(3u, run_task_ids()[4]);
+ ASSERT_EQ(2u, on_task_completed_ids().size());
+ EXPECT_EQ(2u, on_task_completed_ids()[1]);
+}
+
+TEST_F(WorkerPoolTest, MultipleWorkerPoolPriority) {
+ // Setup multiple workerpool.
+ scoped_ptr<FakeWorkerPool>worker_pool1 = FakeWorkerPool::Create();
+ scoped_ptr<FakeWorkerPool>worker_pool2 = FakeWorkerPool::Create();
+ {
+ FakeWorkerPool::Task tasks[] = {
+ FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask,
+ base::Unretained(this),
+ 0u),
+ base::Bind(&WorkerPoolTest::OnTaskCompleted,
+ base::Unretained(this),
+ 0u),
+ base::Bind(&WorkerPoolTest::RunTask,
+ base::Unretained(this),
+ 2u),
+ 1u,
+ 1u), // Priority 1
+ FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask,
+ base::Unretained(this),
+ 1u),
+ base::Bind(&WorkerPoolTest::OnTaskCompleted,
+ base::Unretained(this),
+ 1u),
+ base::Bind(&WorkerPoolTest::RunTask,
+ base::Unretained(this),
+ 3u),
+ 1u,
+ 0u) // Priority 0
+ };
+ worker_pool1->ScheduleTasks(
+ std::vector<FakeWorkerPool::Task>(tasks, tasks + arraysize(tasks)));
+ }
+ worker_pool1->WaitForTasksToComplete();
+ worker_pool1->CheckForCompletedTasks();
+
+ // Check if tasks ran in order of priority.
+ ASSERT_EQ(4u, run_task_ids().size());
+ EXPECT_EQ(1u, run_task_ids()[0]);
+ EXPECT_EQ(3u, run_task_ids()[1]);
+ EXPECT_EQ(0u, run_task_ids()[2]);
+ EXPECT_EQ(2u, run_task_ids()[3]);
+ ASSERT_EQ(2u, on_task_completed_ids().size());
+ EXPECT_EQ(1u, on_task_completed_ids()[0]);
+ EXPECT_EQ(0u, on_task_completed_ids()[1]);
+
+ ResetIds();
+ {
+ std::vector<FakeWorkerPool::Task> tasks;
+ tasks.push_back(
+ FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask,
+ base::Unretained(this),
+ 0u),
+ base::Bind(&WorkerPoolTest::OnTaskCompleted,
+ base::Unretained(this),
+ 0u),
+ base::Bind(&WorkerPoolTest::RunTask,
+ base::Unretained(this),
+ 3u),
+ 1u, // 1 dependent
+ 1u)); // Priority 1
+ tasks.push_back(
+ FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask,
+ base::Unretained(this),
+ 1u),
+ base::Bind(&WorkerPoolTest::OnTaskCompleted,
+ base::Unretained(this),
+ 1u),
+ base::Bind(&WorkerPoolTest::RunTask,
+ base::Unretained(this),
+ 4u),
+ 2u, // 2 dependents
+ 1u)); // Priority 1
+ tasks.push_back(
+ FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask,
+ base::Unretained(this),
+ 2u),
+ base::Bind(&WorkerPoolTest::OnTaskCompleted,
+ base::Unretained(this),
+ 2u),
+ base::Bind(&WorkerPoolTest::RunTask,
+ base::Unretained(this),
+ 5u),
+ 1u, // 1 dependent
+ 0u)); // Priority 0
+ worker_pool2->ScheduleTasks(tasks);
+ }
+ worker_pool2->WaitForTasksToComplete();
+ worker_pool2->CheckForCompletedTasks();
+
+ // Check if tasks ran in order of priority and that task with more
+ // dependents ran first when priority is the same.
+ ASSERT_LE(3u, run_task_ids().size());
+ EXPECT_EQ(2u, run_task_ids()[0]);
+ EXPECT_EQ(5u, run_task_ids()[1]);
+ EXPECT_EQ(1u, run_task_ids()[2]);
+ ASSERT_EQ(3u, on_task_completed_ids().size());
+ EXPECT_EQ(2u, on_task_completed_ids()[0]);
+ EXPECT_EQ(1u, on_task_completed_ids()[1]);
+ EXPECT_EQ(0u, on_task_completed_ids()[2]);
+}
reveman 2014/01/09 16:04:26 I'd like to see the tests run tasks from multiple
+
} // namespace
} // namespace cc

Powered by Google App Engine
This is Rietveld 408576698