12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2011 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/proxy.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/message_loop/message_loop_proxy.h" 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/single_thread_task_runner.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "cc/trees/blocking_task_runner.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::SingleThreadTaskRunner* Proxy::MainThreadTaskRunner() const { 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return main_task_runner_.get(); 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool Proxy::HasImplThread() const { return !!impl_task_runner_.get(); } 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::SingleThreadTaskRunner* Proxy::ImplThreadTaskRunner() const { 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return impl_task_runner_.get(); 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Proxy::IsMainThread() const { 2423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if DCHECK_IS_ON 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (impl_thread_is_overridden_) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool is_main_thread = base::PlatformThread::CurrentId() == main_thread_id_; 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (is_main_thread && main_task_runner_.get()) { 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(main_task_runner_->BelongsToCurrentThread()); 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return is_main_thread; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Proxy::IsImplThread() const { 3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if DCHECK_IS_ON 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (impl_thread_is_overridden_) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!impl_task_runner_.get()) 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return impl_task_runner_->BelongsToCurrentThread(); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if DCHECK_IS_ON 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Proxy::SetCurrentThreadIsImplThread(bool is_impl_thread) { 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) impl_thread_is_overridden_ = is_impl_thread; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Proxy::IsMainThreadBlocked() const { 5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if DCHECK_IS_ON 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return is_main_thread_blocked_; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if DCHECK_IS_ON 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Proxy::SetMainThreadBlocked(bool is_main_thread_blocked) { 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_main_thread_blocked_ = is_main_thread_blocked; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)Proxy::Proxy(scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner) 7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if !DCHECK_IS_ON 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : main_task_runner_(main_task_runner), 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci impl_task_runner_(impl_task_runner), 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blocking_main_thread_task_runner_( 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BlockingTaskRunner::Create(main_task_runner)) { 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : main_task_runner_(main_task_runner), 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch impl_task_runner_(impl_task_runner), 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blocking_main_thread_task_runner_( 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BlockingTaskRunner::Create(main_task_runner)), 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) main_thread_id_(base::PlatformThread::CurrentId()), 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) impl_thread_is_overridden_(false), 8423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) is_main_thread_blocked_(false) { 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 8623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Proxy::~Proxy() { 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(IsMainThread()); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 93