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