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

Unified Diff: base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc

Issue 2902753003: Implement Shared SingleThreadTaskRunners in the Task Scheduler (Closed)
Patch Set: Created 3 years, 7 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/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc
diff --git a/base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc b/base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc
index 4415f5fd808adbd83124cac4686b062d8549e649..4c6153f0af4f38359d6bbe7e7b69a37952bc270a 100644
--- a/base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc
+++ b/base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc
@@ -93,12 +93,14 @@ TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, DifferentThreadsUsed) {
single_thread_task_runner_manager_
->CreateSingleThreadTaskRunnerWithTraits(
"A", ThreadPriority::NORMAL,
- {TaskShutdownBehavior::BLOCK_SHUTDOWN});
+ {TaskShutdownBehavior::BLOCK_SHUTDOWN},
+ SingleThreadTaskRunnerThreadMode::DEDICATED);
scoped_refptr<SingleThreadTaskRunner> task_runner_2 =
single_thread_task_runner_manager_
->CreateSingleThreadTaskRunnerWithTraits(
"B", ThreadPriority::NORMAL,
- {TaskShutdownBehavior::BLOCK_SHUTDOWN});
+ {TaskShutdownBehavior::BLOCK_SHUTDOWN},
+ SingleThreadTaskRunnerThreadMode::DEDICATED);
PlatformThreadRef thread_ref_1;
task_runner_1->PostTask(FROM_HERE,
@@ -114,19 +116,103 @@ TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, DifferentThreadsUsed) {
EXPECT_NE(thread_ref_1, thread_ref_2);
}
-TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, PrioritySetCorrectly) {
+TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, SameThreadUsed) {
+ scoped_refptr<SingleThreadTaskRunner> task_runner_1 =
+ single_thread_task_runner_manager_
+ ->CreateSingleThreadTaskRunnerWithTraits(
+ "A", ThreadPriority::NORMAL,
+ {TaskShutdownBehavior::BLOCK_SHUTDOWN},
+ SingleThreadTaskRunnerThreadMode::SHARED);
+ scoped_refptr<SingleThreadTaskRunner> task_runner_2 =
+ single_thread_task_runner_manager_
+ ->CreateSingleThreadTaskRunnerWithTraits(
+ "B", ThreadPriority::NORMAL,
+ {TaskShutdownBehavior::BLOCK_SHUTDOWN},
+ SingleThreadTaskRunnerThreadMode::SHARED);
+
+ PlatformThreadRef thread_ref_1;
+ task_runner_1->PostTask(FROM_HERE,
+ BindOnce(&CaptureThreadRef, &thread_ref_1));
+ PlatformThreadRef thread_ref_2;
+ task_runner_2->PostTask(FROM_HERE,
+ BindOnce(&CaptureThreadRef, &thread_ref_2));
+
+ task_tracker_.Shutdown();
+
+ ASSERT_FALSE(thread_ref_1.is_null());
+ ASSERT_FALSE(thread_ref_2.is_null());
+ EXPECT_EQ(thread_ref_1, thread_ref_2);
+}
+
+TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest,
+ RunsTasksOnCurrentThread) {
+ scoped_refptr<SingleThreadTaskRunner> task_runner_1 =
+ single_thread_task_runner_manager_
+ ->CreateSingleThreadTaskRunnerWithTraits(
+ "A", ThreadPriority::NORMAL,
+ {TaskShutdownBehavior::BLOCK_SHUTDOWN},
+ SingleThreadTaskRunnerThreadMode::DEDICATED);
+ scoped_refptr<SingleThreadTaskRunner> task_runner_2 =
+ single_thread_task_runner_manager_
+ ->CreateSingleThreadTaskRunnerWithTraits(
+ "B", ThreadPriority::NORMAL,
+ {TaskShutdownBehavior::BLOCK_SHUTDOWN},
+ SingleThreadTaskRunnerThreadMode::DEDICATED);
+
+ EXPECT_FALSE(task_runner_1->RunsTasksOnCurrentThread());
+ EXPECT_FALSE(task_runner_2->RunsTasksOnCurrentThread());
+
+ task_runner_1->PostTask(
+ FROM_HERE, BindOnce(
+ [](scoped_refptr<SingleThreadTaskRunner> task_runner_1,
+ scoped_refptr<SingleThreadTaskRunner> task_runner_2) {
+ EXPECT_TRUE(task_runner_1->RunsTasksOnCurrentThread());
+ EXPECT_FALSE(task_runner_2->RunsTasksOnCurrentThread());
+ },
+ task_runner_1, task_runner_2));
+
+ task_runner_2->PostTask(
+ FROM_HERE, BindOnce(
+ [](scoped_refptr<SingleThreadTaskRunner> task_runner_1,
+ scoped_refptr<SingleThreadTaskRunner> task_runner_2) {
+ EXPECT_FALSE(task_runner_1->RunsTasksOnCurrentThread());
+ EXPECT_TRUE(task_runner_2->RunsTasksOnCurrentThread());
+ },
+ task_runner_1, task_runner_2));
+
+ task_tracker_.Shutdown();
+}
+
+namespace {
+
+class TaskSchedulerSingleThreadTaskRunnerManagerCommonTest
+ : public TaskSchedulerSingleThreadTaskRunnerManagerTest,
+ public ::testing::WithParamInterface<SingleThreadTaskRunnerThreadMode> {
+ public:
+ TaskSchedulerSingleThreadTaskRunnerManagerCommonTest() = default;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(
+ TaskSchedulerSingleThreadTaskRunnerManagerCommonTest);
+};
+
+} // namespace
+
+TEST_P(TaskSchedulerSingleThreadTaskRunnerManagerCommonTest,
+ PrioritySetCorrectly) {
// Why are events used here instead of the task tracker?
// Shutting down can cause priorities to get raised. This means we have to use
// events to determine when a task is run.
scoped_refptr<SingleThreadTaskRunner> task_runner_background =
single_thread_task_runner_manager_
- ->CreateSingleThreadTaskRunnerWithTraits("Background",
- ThreadPriority::BACKGROUND,
- {TaskPriority::BACKGROUND});
+ ->CreateSingleThreadTaskRunnerWithTraits(
+ "Background", ThreadPriority::BACKGROUND,
+ {TaskPriority::BACKGROUND}, GetParam());
scoped_refptr<SingleThreadTaskRunner> task_runner_normal =
single_thread_task_runner_manager_
->CreateSingleThreadTaskRunnerWithTraits(
- "Normal", ThreadPriority::NORMAL, {TaskPriority::USER_VISIBLE});
+ "Normal", ThreadPriority::NORMAL, {TaskPriority::USER_VISIBLE},
+ GetParam());
ThreadPriority thread_priority_background;
task_runner_background->PostTask(
@@ -158,24 +244,27 @@ TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, PrioritySetCorrectly) {
EXPECT_EQ(ThreadPriority::NORMAL, thread_priority_normal);
}
-TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, PostTaskAfterShutdown) {
- auto task_runner = single_thread_task_runner_manager_
- ->CreateSingleThreadTaskRunnerWithTraits(
- "A", ThreadPriority::NORMAL, TaskTraits());
+TEST_P(TaskSchedulerSingleThreadTaskRunnerManagerCommonTest,
+ PostTaskAfterShutdown) {
+ auto task_runner =
+ single_thread_task_runner_manager_
+ ->CreateSingleThreadTaskRunnerWithTraits("A", ThreadPriority::NORMAL,
+ TaskTraits(), GetParam());
task_tracker_.Shutdown();
EXPECT_FALSE(task_runner->PostTask(FROM_HERE, BindOnce(&ShouldNotRun)));
}
// Verify that a Task runs shortly after its delay expires.
-TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, PostDelayedTask) {
+TEST_P(TaskSchedulerSingleThreadTaskRunnerManagerCommonTest, PostDelayedTask) {
TimeTicks start_time = TimeTicks::Now();
// Post a task with a short delay.
WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL,
WaitableEvent::InitialState::NOT_SIGNALED);
- auto task_runner = single_thread_task_runner_manager_
- ->CreateSingleThreadTaskRunnerWithTraits(
- "A", ThreadPriority::NORMAL, TaskTraits());
+ auto task_runner =
+ single_thread_task_runner_manager_
+ ->CreateSingleThreadTaskRunnerWithTraits("A", ThreadPriority::NORMAL,
+ TaskTraits(), GetParam());
EXPECT_TRUE(task_runner->PostDelayedTask(
FROM_HERE, BindOnce(&WaitableEvent::Signal, Unretained(&task_ran)),
TestTimeouts::tiny_timeout()));
@@ -191,42 +280,11 @@ TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, PostDelayedTask) {
TimeDelta::FromMilliseconds(250) + TestTimeouts::tiny_timeout());
}
-TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest,
- RunsTasksOnCurrentThread) {
- scoped_refptr<SingleThreadTaskRunner> task_runner_1 =
- single_thread_task_runner_manager_
- ->CreateSingleThreadTaskRunnerWithTraits(
- "A", ThreadPriority::NORMAL,
- {TaskShutdownBehavior::BLOCK_SHUTDOWN});
- scoped_refptr<SingleThreadTaskRunner> task_runner_2 =
- single_thread_task_runner_manager_
- ->CreateSingleThreadTaskRunnerWithTraits(
- "B", ThreadPriority::NORMAL,
- {TaskShutdownBehavior::BLOCK_SHUTDOWN});
-
- EXPECT_FALSE(task_runner_1->RunsTasksOnCurrentThread());
- EXPECT_FALSE(task_runner_2->RunsTasksOnCurrentThread());
-
- task_runner_1->PostTask(
- FROM_HERE, BindOnce(
- [](scoped_refptr<SingleThreadTaskRunner> task_runner_1,
- scoped_refptr<SingleThreadTaskRunner> task_runner_2) {
- EXPECT_TRUE(task_runner_1->RunsTasksOnCurrentThread());
- EXPECT_FALSE(task_runner_2->RunsTasksOnCurrentThread());
- },
- task_runner_1, task_runner_2));
-
- task_runner_2->PostTask(
- FROM_HERE, BindOnce(
- [](scoped_refptr<SingleThreadTaskRunner> task_runner_1,
- scoped_refptr<SingleThreadTaskRunner> task_runner_2) {
- EXPECT_FALSE(task_runner_1->RunsTasksOnCurrentThread());
- EXPECT_TRUE(task_runner_2->RunsTasksOnCurrentThread());
- },
- task_runner_1, task_runner_2));
-
- task_tracker_.Shutdown();
-}
+INSTANTIATE_TEST_CASE_P(
+ AllModes,
+ TaskSchedulerSingleThreadTaskRunnerManagerCommonTest,
+ ::testing::Values(SingleThreadTaskRunnerThreadMode::SHARED,
+ SingleThreadTaskRunnerThreadMode::DEDICATED));
namespace {
@@ -285,7 +343,8 @@ TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerJoinTest, ConcurrentJoin) {
auto task_runner =
single_thread_task_runner_manager_
->CreateSingleThreadTaskRunnerWithTraits(
- "A", ThreadPriority::NORMAL, {WithBaseSyncPrimitives()});
+ "A", ThreadPriority::NORMAL, {WithBaseSyncPrimitives()},
+ SingleThreadTaskRunnerThreadMode::DEDICATED);
EXPECT_TRUE(task_runner->PostTask(
FROM_HERE,
BindOnce(&WaitableEvent::Signal, Unretained(&task_running))));
@@ -315,7 +374,8 @@ TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerJoinTest,
auto task_runner =
single_thread_task_runner_manager_
->CreateSingleThreadTaskRunnerWithTraits(
- "A", ThreadPriority::NORMAL, {WithBaseSyncPrimitives()});
+ "A", ThreadPriority::NORMAL, {WithBaseSyncPrimitives()},
+ SingleThreadTaskRunnerThreadMode::DEDICATED);
EXPECT_TRUE(task_runner->PostTask(
FROM_HERE,
BindOnce(&WaitableEvent::Signal, Unretained(&task_running))));
@@ -335,10 +395,12 @@ TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerJoinTest,
#if defined(OS_WIN)
-TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, COMSTAInitialized) {
+TEST_P(TaskSchedulerSingleThreadTaskRunnerManagerCommonTest,
+ COMSTAInitialized) {
scoped_refptr<SingleThreadTaskRunner> com_task_runner =
single_thread_task_runner_manager_->CreateCOMSTATaskRunnerWithTraits(
- "A", ThreadPriority::NORMAL, {TaskShutdownBehavior::BLOCK_SHUTDOWN});
+ "A", ThreadPriority::NORMAL, {TaskShutdownBehavior::BLOCK_SHUTDOWN},
+ GetParam());
com_task_runner->PostTask(
FROM_HERE, BindOnce([]() {
@@ -352,6 +414,30 @@ TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, COMSTAInitialized) {
task_tracker_.Shutdown();
}
+TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, COMSTASameThreadUsed) {
+ scoped_refptr<SingleThreadTaskRunner> task_runner_1 =
+ single_thread_task_runner_manager_->CreateCOMSTATaskRunnerWithTraits(
+ "A", ThreadPriority::NORMAL, {TaskShutdownBehavior::BLOCK_SHUTDOWN},
+ SingleThreadTaskRunnerThreadMode::SHARED);
+ scoped_refptr<SingleThreadTaskRunner> task_runner_2 =
+ single_thread_task_runner_manager_->CreateCOMSTATaskRunnerWithTraits(
+ "B", ThreadPriority::NORMAL, {TaskShutdownBehavior::BLOCK_SHUTDOWN},
+ SingleThreadTaskRunnerThreadMode::SHARED);
+
+ PlatformThreadRef thread_ref_1;
+ task_runner_1->PostTask(FROM_HERE,
+ BindOnce(&CaptureThreadRef, &thread_ref_1));
+ PlatformThreadRef thread_ref_2;
+ task_runner_2->PostTask(FROM_HERE,
+ BindOnce(&CaptureThreadRef, &thread_ref_2));
+
+ task_tracker_.Shutdown();
+
+ ASSERT_FALSE(thread_ref_1.is_null());
+ ASSERT_FALSE(thread_ref_2.is_null());
+ EXPECT_EQ(thread_ref_1, thread_ref_2);
+}
+
namespace {
const wchar_t* const kTestWindowClassName =
@@ -400,7 +486,8 @@ class TaskSchedulerSingleThreadTaskRunnerManagerTestWin
TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTestWin, PumpsMessages) {
scoped_refptr<SingleThreadTaskRunner> com_task_runner =
single_thread_task_runner_manager_->CreateCOMSTATaskRunnerWithTraits(
- "A", ThreadPriority::NORMAL, {TaskShutdownBehavior::BLOCK_SHUTDOWN});
+ "A", ThreadPriority::NORMAL, {TaskShutdownBehavior::BLOCK_SHUTDOWN},
+ SingleThreadTaskRunnerThreadMode::DEDICATED);
HWND hwnd = nullptr;
// HWNDs process messages on the thread that created them, so we have to
// create them within the context of the task runner to properly simulate a
@@ -451,8 +538,9 @@ TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerStartTest,
WaitableEvent task_running(WaitableEvent::ResetPolicy::MANUAL,
WaitableEvent::InitialState::NOT_SIGNALED);
single_thread_task_runner_manager_
- ->CreateSingleThreadTaskRunnerWithTraits("A", ThreadPriority::NORMAL,
- TaskTraits())
+ ->CreateSingleThreadTaskRunnerWithTraits(
+ "A", ThreadPriority::NORMAL, TaskTraits(),
+ SingleThreadTaskRunnerThreadMode::DEDICATED)
->PostTask(
FROM_HERE,
BindOnce(

Powered by Google App Engine
This is Rietveld 408576698