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