proxy.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
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"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::SingleThreadTaskRunner* Proxy::MainThreadTaskRunner() const {
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return main_task_runner_.get();
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool Proxy::HasImplThread() const { return !!impl_task_runner_.get(); }
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::SingleThreadTaskRunner* Proxy::ImplThreadTaskRunner() const {
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return impl_task_runner_.get();
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Proxy::IsMainThread() const {
2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if DCHECK_IS_ON
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (impl_thread_is_overridden_)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool is_main_thread = base::PlatformThread::CurrentId() == main_thread_id_;
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (is_main_thread && main_task_runner_.get()) {
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK(main_task_runner_->BelongsToCurrentThread());
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return is_main_thread;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Proxy::IsImplThread() const {
3823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if DCHECK_IS_ON
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (impl_thread_is_overridden_)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!impl_task_runner_.get())
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return false;
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return impl_task_runner_->BelongsToCurrentThread();
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if DCHECK_IS_ON
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Proxy::SetCurrentThreadIsImplThread(bool is_impl_thread) {
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  impl_thread_is_overridden_ = is_impl_thread;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Proxy::IsMainThreadBlocked() const {
5623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if DCHECK_IS_ON
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return is_main_thread_blocked_;
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if DCHECK_IS_ON
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Proxy::SetMainThreadBlocked(bool is_main_thread_blocked) {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_main_thread_blocked_ = is_main_thread_blocked;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)Proxy::Proxy(scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)             scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner)
7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if !DCHECK_IS_ON
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : main_task_runner_(main_task_runner), impl_task_runner_(impl_task_runner) {
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : main_task_runner_(main_task_runner),
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      impl_task_runner_(impl_task_runner),
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      main_thread_id_(base::PlatformThread::CurrentId()),
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      impl_thread_is_overridden_(false),
7823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      is_main_thread_blocked_(false) {
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
8023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Proxy::~Proxy() {
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(IsMainThread());
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
87