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( |