| // Copyright 2011 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/single_thread_task_runner.h" |
| #include "cc/trees/blocking_task_runner.h" |
| #include "cc/trees/task_runner_provider.h" |
| |
| namespace cc { |
| |
| base::SingleThreadTaskRunner* TaskRunnerProvider::MainThreadTaskRunner() const { |
| return main_task_runner_.get(); |
| } |
| |
| bool TaskRunnerProvider::HasImplThread() const { |
| return !!impl_task_runner_.get(); |
| } |
| |
| base::SingleThreadTaskRunner* TaskRunnerProvider::ImplThreadTaskRunner() const { |
| return impl_task_runner_.get(); |
| } |
| |
| bool TaskRunnerProvider::IsMainThread() const { |
| #if DCHECK_IS_ON() |
| if (impl_thread_is_overridden_) |
| return false; |
| |
| bool is_main_thread = base::PlatformThread::CurrentId() == main_thread_id_; |
| if (is_main_thread && main_task_runner_.get()) { |
| DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| } |
| return is_main_thread; |
| #else |
| return true; |
| #endif |
| } |
| |
| bool TaskRunnerProvider::IsImplThread() const { |
| #if DCHECK_IS_ON() |
| if (impl_thread_is_overridden_) |
| return true; |
| if (!impl_task_runner_.get()) |
| return false; |
| return impl_task_runner_->BelongsToCurrentThread(); |
| #else |
| return true; |
| #endif |
| } |
| |
| #if DCHECK_IS_ON() |
| void TaskRunnerProvider::SetCurrentThreadIsImplThread(bool is_impl_thread) { |
| impl_thread_is_overridden_ = is_impl_thread; |
| } |
| #endif |
| |
| bool TaskRunnerProvider::IsMainThreadBlocked() const { |
| #if DCHECK_IS_ON() |
| return is_main_thread_blocked_; |
| #else |
| return true; |
| #endif |
| } |
| |
| #if DCHECK_IS_ON() |
| void TaskRunnerProvider::SetMainThreadBlocked(bool is_main_thread_blocked) { |
| is_main_thread_blocked_ = is_main_thread_blocked; |
| } |
| #endif |
| |
| TaskRunnerProvider::TaskRunnerProvider( |
| scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, |
| scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner) |
| #if !DCHECK_IS_ON() |
| : main_task_runner_(main_task_runner), |
| impl_task_runner_(impl_task_runner), |
| blocking_main_thread_task_runner_( |
| BlockingTaskRunner::Create(main_task_runner)) { |
| #else |
| : main_task_runner_(main_task_runner), |
| impl_task_runner_(impl_task_runner), |
| blocking_main_thread_task_runner_( |
| BlockingTaskRunner::Create(main_task_runner)), |
| main_thread_id_(base::PlatformThread::CurrentId()), |
| impl_thread_is_overridden_(false), |
| is_main_thread_blocked_(false) { |
| #endif |
| } |
| |
| TaskRunnerProvider::~TaskRunnerProvider() { |
| DCHECK(IsMainThread()); |
| } |
| |
| } // namespace cc |