blob: e981a722cad6393ce40faf6bf8785fd09633cdc9 [file] [log] [blame]
James Robinson646469d2014-10-03 15:33:28 -07001// 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