1// Copyright 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "cc/trees/proxy.h"
6
7#include "base/message_loop/message_loop_proxy.h"
8#include "base/single_thread_task_runner.h"
9#include "cc/trees/blocking_task_runner.h"
10
11namespace cc {
12
13base::SingleThreadTaskRunner* Proxy::MainThreadTaskRunner() const {
14  return main_task_runner_.get();
15}
16
17bool Proxy::HasImplThread() const { return !!impl_task_runner_.get(); }
18
19base::SingleThreadTaskRunner* Proxy::ImplThreadTaskRunner() const {
20  return impl_task_runner_.get();
21}
22
23bool Proxy::IsMainThread() const {
24#if DCHECK_IS_ON
25  if (impl_thread_is_overridden_)
26    return false;
27
28  bool is_main_thread = base::PlatformThread::CurrentId() == main_thread_id_;
29  if (is_main_thread && main_task_runner_.get()) {
30    DCHECK(main_task_runner_->BelongsToCurrentThread());
31  }
32  return is_main_thread;
33#else
34  return true;
35#endif
36}
37
38bool Proxy::IsImplThread() const {
39#if DCHECK_IS_ON
40  if (impl_thread_is_overridden_)
41    return true;
42  if (!impl_task_runner_.get())
43    return false;
44  return impl_task_runner_->BelongsToCurrentThread();
45#else
46  return true;
47#endif
48}
49
50#if DCHECK_IS_ON
51void Proxy::SetCurrentThreadIsImplThread(bool is_impl_thread) {
52  impl_thread_is_overridden_ = is_impl_thread;
53}
54#endif
55
56bool Proxy::IsMainThreadBlocked() const {
57#if DCHECK_IS_ON
58  return is_main_thread_blocked_;
59#else
60  return true;
61#endif
62}
63
64#if DCHECK_IS_ON
65void Proxy::SetMainThreadBlocked(bool is_main_thread_blocked) {
66  is_main_thread_blocked_ = is_main_thread_blocked;
67}
68#endif
69
70Proxy::Proxy(scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
71             scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner)
72#if !DCHECK_IS_ON
73    : main_task_runner_(main_task_runner),
74      impl_task_runner_(impl_task_runner),
75      blocking_main_thread_task_runner_(
76          BlockingTaskRunner::Create(main_task_runner)) {
77#else
78    : main_task_runner_(main_task_runner),
79      impl_task_runner_(impl_task_runner),
80      blocking_main_thread_task_runner_(
81          BlockingTaskRunner::Create(main_task_runner)),
82      main_thread_id_(base::PlatformThread::CurrentId()),
83      impl_thread_is_overridden_(false),
84      is_main_thread_blocked_(false) {
85#endif
86}
87
88Proxy::~Proxy() {
89  DCHECK(IsMainThread());
90}
91
92}  // namespace cc
93