| // Copyright 2013 The Flutter 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 "flutter/fml/memory/task_runner_checker.h" | |
| namespace fml { | |
| TaskRunnerChecker::TaskRunnerChecker() | |
| : initialized_queue_id_(InitTaskQueueId()), | |
| subsumed_queue_ids_( | |
| MessageLoopTaskQueues::GetInstance()->GetSubsumedTaskQueueId( | |
| initialized_queue_id_)){}; | |
| TaskRunnerChecker::~TaskRunnerChecker() = default; | |
| bool TaskRunnerChecker::RunsOnCreationTaskRunner() const { | |
| FML_CHECK(fml::MessageLoop::IsInitializedForCurrentThread()); | |
| const auto current_queue_id = MessageLoop::GetCurrentTaskQueueId(); | |
| if (RunsOnTheSameThread(current_queue_id, initialized_queue_id_)) { | |
| return true; | |
| } | |
| for (auto& subsumed : subsumed_queue_ids_) { | |
| if (RunsOnTheSameThread(current_queue_id, subsumed)) { | |
| return true; | |
| } | |
| } | |
| return false; | |
| }; | |
| bool TaskRunnerChecker::RunsOnTheSameThread(TaskQueueId queue_a, | |
| TaskQueueId queue_b) { | |
| if (queue_a == queue_b) { | |
| return true; | |
| } | |
| auto queues = MessageLoopTaskQueues::GetInstance(); | |
| if (queues->Owns(queue_a, queue_b)) { | |
| return true; | |
| } | |
| if (queues->Owns(queue_b, queue_a)) { | |
| return true; | |
| } | |
| return false; | |
| }; | |
| TaskQueueId TaskRunnerChecker::InitTaskQueueId() { | |
| MessageLoop::EnsureInitializedForCurrentThread(); | |
| return MessageLoop::GetCurrentTaskQueueId(); | |
| }; | |
| } // namespace fml |