OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/task_scheduler/scheduler_single_thread_task_runner_manager.h" | 5 #include "base/task_scheduler/scheduler_single_thread_task_runner_manager.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/memory/ptr_util.h" | 8 #include "base/memory/ptr_util.h" |
| 9 #include "base/synchronization/atomic_flag.h" |
9 #include "base/synchronization/lock.h" | 10 #include "base/synchronization/lock.h" |
10 #include "base/synchronization/waitable_event.h" | 11 #include "base/synchronization/waitable_event.h" |
11 #include "base/task_scheduler/delayed_task_manager.h" | 12 #include "base/task_scheduler/delayed_task_manager.h" |
12 #include "base/task_scheduler/post_task.h" | 13 #include "base/task_scheduler/post_task.h" |
13 #include "base/task_scheduler/scheduler_worker_pool_params.h" | 14 #include "base/task_scheduler/scheduler_worker_pool_params.h" |
14 #include "base/task_scheduler/task_tracker.h" | 15 #include "base/task_scheduler/task_tracker.h" |
15 #include "base/task_scheduler/task_traits.h" | 16 #include "base/task_scheduler/task_traits.h" |
16 #include "base/test/test_timeouts.h" | 17 #include "base/test/test_timeouts.h" |
| 18 #include "base/threading/platform_thread.h" |
17 #include "base/threading/simple_thread.h" | 19 #include "base/threading/simple_thread.h" |
18 #include "base/threading/thread.h" | 20 #include "base/threading/thread.h" |
19 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
20 | 22 |
21 #if defined(OS_WIN) | 23 #if defined(OS_WIN) |
22 #include <windows.h> | 24 #include <windows.h> |
23 #include <objbase.h> | 25 #include <objbase.h> |
24 | 26 |
25 #include "base/win/current_module.h" | 27 #include "base/win/current_module.h" |
26 #endif // defined(OS_WIN) | 28 #endif // defined(OS_WIN) |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 | 65 |
64 void SetUp() override { | 66 void SetUp() override { |
65 service_thread_.Start(); | 67 service_thread_.Start(); |
66 | 68 |
67 delayed_task_manager_ = | 69 delayed_task_manager_ = |
68 MakeUnique<DelayedTaskManager>(service_thread_.task_runner()); | 70 MakeUnique<DelayedTaskManager>(service_thread_.task_runner()); |
69 single_thread_task_runner_manager_ = | 71 single_thread_task_runner_manager_ = |
70 MakeUnique<SchedulerSingleThreadTaskRunnerManager>( | 72 MakeUnique<SchedulerSingleThreadTaskRunnerManager>( |
71 GetParamsVector(), Bind(&GetThreadPoolIndexForTraits), | 73 GetParamsVector(), Bind(&GetThreadPoolIndexForTraits), |
72 &task_tracker_, delayed_task_manager_.get()); | 74 &task_tracker_, delayed_task_manager_.get()); |
| 75 StartSingleThreadTaskRunnerManagerFromSetUp(); |
73 } | 76 } |
74 | 77 |
75 void TearDown() override { | 78 void TearDown() override { |
76 TearDownSingleThreadTaskRunnerManager(); | 79 TearDownSingleThreadTaskRunnerManager(); |
77 delayed_task_manager_.reset(); | 80 delayed_task_manager_.reset(); |
78 service_thread_.Stop(); | 81 service_thread_.Stop(); |
79 } | 82 } |
80 | 83 |
81 protected: | 84 protected: |
| 85 virtual void StartSingleThreadTaskRunnerManagerFromSetUp() { |
| 86 single_thread_task_runner_manager_->Start(); |
| 87 } |
| 88 |
82 virtual void TearDownSingleThreadTaskRunnerManager() { | 89 virtual void TearDownSingleThreadTaskRunnerManager() { |
83 single_thread_task_runner_manager_->JoinForTesting(); | 90 single_thread_task_runner_manager_->JoinForTesting(); |
84 single_thread_task_runner_manager_.reset(); | 91 single_thread_task_runner_manager_.reset(); |
85 } | 92 } |
86 | 93 |
87 std::unique_ptr<SchedulerSingleThreadTaskRunnerManager> | 94 std::unique_ptr<SchedulerSingleThreadTaskRunnerManager> |
88 single_thread_task_runner_manager_; | 95 single_thread_task_runner_manager_; |
89 TaskTracker task_tracker_; | 96 TaskTracker task_tracker_; |
90 | 97 |
91 private: | 98 private: |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
459 SendMessage(hwnd, WM_USER, 0, 0); | 466 SendMessage(hwnd, WM_USER, 0, 0); |
460 | 467 |
461 com_task_runner->PostTask( | 468 com_task_runner->PostTask( |
462 FROM_HERE, Bind([](HWND hwnd) { ::DestroyWindow(hwnd); }, hwnd)); | 469 FROM_HERE, Bind([](HWND hwnd) { ::DestroyWindow(hwnd); }, hwnd)); |
463 | 470 |
464 task_tracker_.Shutdown(); | 471 task_tracker_.Shutdown(); |
465 } | 472 } |
466 | 473 |
467 #endif // defined(OS_WIN) | 474 #endif // defined(OS_WIN) |
468 | 475 |
| 476 namespace { |
| 477 |
| 478 class TaskSchedulerSingleThreadTaskRunnerManagerStartTest |
| 479 : public TaskSchedulerSingleThreadTaskRunnerManagerTest { |
| 480 public: |
| 481 TaskSchedulerSingleThreadTaskRunnerManagerStartTest() = default; |
| 482 |
| 483 private: |
| 484 void StartSingleThreadTaskRunnerManagerFromSetUp() override { |
| 485 // Start() is called in the test body rather than in SetUp(). |
| 486 } |
| 487 |
| 488 DISALLOW_COPY_AND_ASSIGN(TaskSchedulerSingleThreadTaskRunnerManagerStartTest); |
| 489 }; |
| 490 |
| 491 } // namespace |
| 492 |
| 493 // Verify that a task posted before Start() doesn't run until Start() is called. |
| 494 TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerStartTest, |
| 495 PostTaskBeforeStart) { |
| 496 AtomicFlag manager_started; |
| 497 WaitableEvent task_running(WaitableEvent::ResetPolicy::MANUAL, |
| 498 WaitableEvent::InitialState::NOT_SIGNALED); |
| 499 single_thread_task_runner_manager_ |
| 500 ->CreateSingleThreadTaskRunnerWithTraits(TaskTraits()) |
| 501 ->PostTask( |
| 502 FROM_HERE, |
| 503 Bind( |
| 504 [](WaitableEvent* task_running, AtomicFlag* manager_started) { |
| 505 task_running->Signal(); |
| 506 |
| 507 // The task should not run before Start(). |
| 508 EXPECT_TRUE(manager_started->IsSet()); |
| 509 }, |
| 510 Unretained(&task_running), Unretained(&manager_started))); |
| 511 |
| 512 // Wait a little bit to make sure that the task isn't scheduled before start. |
| 513 // Note: This test won't catch a case where the task is scheduled between |
| 514 // setting |manager_started| and calling Start(). However, we expect the test |
| 515 // to be flaky if the tested code allows that to happen. |
| 516 PlatformThread::Sleep(TestTimeouts::tiny_timeout()); |
| 517 manager_started.Set(); |
| 518 single_thread_task_runner_manager_->Start(); |
| 519 |
| 520 // This should not hang if the task is scheduled after Start(). |
| 521 task_running.Wait(); |
| 522 } |
| 523 |
469 } // namespace internal | 524 } // namespace internal |
470 } // namespace base | 525 } // namespace base |
OLD | NEW |