| // Copyright 2018 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "base/task/sequence_manager/test/sequence_manager_for_test.h" | |
| #include "base/task/sequence_manager/thread_controller_impl.h" | |
| namespace base { | |
| namespace sequence_manager { | |
| namespace { | |
| class ThreadControllerForTest : public internal::ThreadControllerImpl { | |
| public: | |
| ThreadControllerForTest(MessageLoop* message_loop, | |
| scoped_refptr<SingleThreadTaskRunner> task_runner, | |
| const TickClock* time_source) | |
| : ThreadControllerImpl(message_loop, | |
| std::move(task_runner), | |
| time_source) {} | |
| void AddNestingObserver(RunLoop::NestingObserver* observer) override { | |
| if (!message_loop_) | |
| return; | |
| ThreadControllerImpl::AddNestingObserver(observer); | |
| } | |
| void RemoveNestingObserver(RunLoop::NestingObserver* observer) override { | |
| if (!message_loop_) | |
| return; | |
| ThreadControllerImpl::RemoveNestingObserver(observer); | |
| } | |
| ~ThreadControllerForTest() override = default; | |
| }; | |
| } // namespace | |
| SequenceManagerForTest::SequenceManagerForTest( | |
| std::unique_ptr<internal::ThreadController> thread_controller) | |
| : SequenceManagerImpl(std::move(thread_controller)) {} | |
| // static | |
| std::unique_ptr<SequenceManagerForTest> SequenceManagerForTest::Create( | |
| MessageLoop* message_loop, | |
| scoped_refptr<SingleThreadTaskRunner> task_runner, | |
| const TickClock* clock) { | |
| std::unique_ptr<SequenceManagerForTest> manager( | |
| new SequenceManagerForTest(std::make_unique<ThreadControllerForTest>( | |
| message_loop, std::move(task_runner), clock))); | |
| manager->BindToCurrentThread(); | |
| manager->CompleteInitializationOnBoundThread(); | |
| return manager; | |
| } | |
| // static | |
| std::unique_ptr<SequenceManagerForTest> SequenceManagerForTest::Create( | |
| std::unique_ptr<internal::ThreadController> thread_controller) { | |
| std::unique_ptr<SequenceManagerForTest> manager( | |
| new SequenceManagerForTest(std::move(thread_controller))); | |
| manager->BindToCurrentThread(); | |
| manager->CompleteInitializationOnBoundThread(); | |
| return manager; | |
| } | |
| size_t SequenceManagerForTest::ActiveQueuesCount() const { | |
| return main_thread_only().active_queues.size(); | |
| } | |
| bool SequenceManagerForTest::HasImmediateWork() const { | |
| return !main_thread_only().selector.AllEnabledWorkQueuesAreEmpty(); | |
| } | |
| size_t SequenceManagerForTest::PendingTasksCount() const { | |
| size_t task_count = 0; | |
| for (auto* const queue : main_thread_only().active_queues) | |
| task_count += queue->GetNumberOfPendingTasks(); | |
| return task_count; | |
| } | |
| size_t SequenceManagerForTest::QueuesToDeleteCount() const { | |
| return main_thread_only().queues_to_delete.size(); | |
| } | |
| size_t SequenceManagerForTest::QueuesToShutdownCount() { | |
| TakeQueuesToGracefullyShutdownFromHelper(); | |
| return main_thread_only().queues_to_gracefully_shutdown.size(); | |
| } | |
| } // namespace sequence_manager | |
| } // namespace base |