| 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 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 453 SendMessage(hwnd, WM_USER, 0, 0); | 460 SendMessage(hwnd, WM_USER, 0, 0); |
| 454 | 461 |
| 455 com_task_runner->PostTask( | 462 com_task_runner->PostTask( |
| 456 FROM_HERE, Bind([](HWND hwnd) { ::DestroyWindow(hwnd); }, hwnd)); | 463 FROM_HERE, Bind([](HWND hwnd) { ::DestroyWindow(hwnd); }, hwnd)); |
| 457 | 464 |
| 458 task_tracker_.Shutdown(); | 465 task_tracker_.Shutdown(); |
| 459 } | 466 } |
| 460 | 467 |
| 461 #endif // defined(OS_WIN) | 468 #endif // defined(OS_WIN) |
| 462 | 469 |
| 470 namespace { |
| 471 |
| 472 class TaskSchedulerSingleThreadTaskRunnerManagerStartTest |
| 473 : public TaskSchedulerSingleThreadTaskRunnerManagerTest { |
| 474 public: |
| 475 TaskSchedulerSingleThreadTaskRunnerManagerStartTest() = default; |
| 476 |
| 477 private: |
| 478 void StartSingleThreadTaskRunnerManagerFromSetup() override { |
| 479 // Start() will be called in the test body. |
| 480 } |
| 481 |
| 482 DISALLOW_COPY_AND_ASSIGN(TaskSchedulerSingleThreadTaskRunnerManagerStartTest); |
| 483 }; |
| 484 |
| 485 } // namespace |
| 486 |
| 487 // Verify that a task posted before Start() doesn't run until Start() is called. |
| 488 // Don't use the TaskSchedulerSingleThreadTaskRunnerManagerTest fixture |
| 489 TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerStartTest, |
| 490 PostTaskBeforeStart) { |
| 491 AtomicFlag manager_started; |
| 492 WaitableEvent task_running(WaitableEvent::ResetPolicy::MANUAL, |
| 493 WaitableEvent::InitialState::NOT_SIGNALED); |
| 494 single_thread_task_runner_manager_ |
| 495 ->CreateSingleThreadTaskRunnerWithTraits(TaskTraits()) |
| 496 ->PostTask( |
| 497 FROM_HERE, |
| 498 Bind( |
| 499 [](WaitableEvent* task_running, AtomicFlag* manager_started) { |
| 500 task_running->Signal(); |
| 501 |
| 502 // The task should not run before Start(). |
| 503 EXPECT_TRUE(manager_started->IsSet()); |
| 504 }, |
| 505 Unretained(&task_running), Unretained(&manager_started))); |
| 506 |
| 507 // Wait a little bit to make sure that the task isn't scheduled before start. |
| 508 // Note: This test won't catch a case where the task is scheduled between |
| 509 // setting |manager_started| and calling Start(). However, we expect the test |
| 510 // to be flaky if the tested code allows that to happen. |
| 511 PlatformThread::Sleep(TestTimeouts::tiny_timeout()); |
| 512 manager_started.Set(); |
| 513 single_thread_task_runner_manager_->Start(); |
| 514 |
| 515 // This should not hang if the task is scheduled after Start(). |
| 516 task_running.Wait(); |
| 517 } |
| 518 |
| 463 } // namespace internal | 519 } // namespace internal |
| 464 } // namespace base | 520 } // namespace base |
| OLD | NEW |