| Index: cc/trees/task_runner_provider.h
|
| diff --git a/cc/trees/task_runner_provider.h b/cc/trees/task_runner_provider.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..884a2426bbb0d8725e607230c5335487988626d6
|
| --- /dev/null
|
| +++ b/cc/trees/task_runner_provider.h
|
| @@ -0,0 +1,107 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef CC_TREES_TASK_RUNNER_PROVIDER_H_
|
| +#define CC_TREES_TASK_RUNNER_PROVIDER_H_
|
| +
|
| +#include <string>
|
| +
|
| +#include "base/basictypes.h"
|
| +#include "base/logging.h"
|
| +#include "base/memory/ref_counted.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "base/threading/platform_thread.h"
|
| +#include "base/time/time.h"
|
| +#include "base/values.h"
|
| +#include "cc/base/cc_export.h"
|
| +
|
| +namespace base {
|
| +namespace trace_event {
|
| +class TracedValue;
|
| +}
|
| +class SingleThreadTaskRunner;
|
| +}
|
| +
|
| +namespace cc {
|
| +class BlockingTaskRunner;
|
| +
|
| +// Class responsible for controlling access to the main and impl task runners.
|
| +// Useful for assertion checks.
|
| +class CC_EXPORT TaskRunnerProvider {
|
| + public:
|
| + base::SingleThreadTaskRunner* MainThreadTaskRunner() const;
|
| + bool HasImplThread() const;
|
| + base::SingleThreadTaskRunner* ImplThreadTaskRunner() const;
|
| +
|
| + // Debug hooks.
|
| + bool IsMainThread() const;
|
| + bool IsImplThread() const;
|
| + bool IsMainThreadBlocked() const;
|
| +#if DCHECK_IS_ON()
|
| + void SetMainThreadBlocked(bool is_main_thread_blocked);
|
| + void SetCurrentThreadIsImplThread(bool is_impl_thread);
|
| +#endif
|
| +
|
| + virtual ~TaskRunnerProvider();
|
| +
|
| + BlockingTaskRunner* blocking_main_thread_task_runner() const {
|
| + return blocking_main_thread_task_runner_.get();
|
| + }
|
| +
|
| + TaskRunnerProvider(
|
| + scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
|
| + scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner);
|
| +
|
| + protected:
|
| + friend class DebugScopedSetImplThread;
|
| + friend class DebugScopedSetMainThread;
|
| + friend class DebugScopedSetMainThreadBlocked;
|
| +
|
| + private:
|
| + scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
|
| + scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner_;
|
| + scoped_ptr<BlockingTaskRunner> blocking_main_thread_task_runner_;
|
| +
|
| +#if DCHECK_IS_ON()
|
| + const base::PlatformThreadId main_thread_id_;
|
| + bool impl_thread_is_overridden_;
|
| + bool is_main_thread_blocked_;
|
| +#endif
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TaskRunnerProvider);
|
| +};
|
| +
|
| +#if DCHECK_IS_ON()
|
| +class DebugScopedSetMainThreadBlocked {
|
| + public:
|
| + explicit DebugScopedSetMainThreadBlocked(
|
| + TaskRunnerProvider* task_runner_provider)
|
| + : task_runner_provider_(task_runner_provider) {
|
| + DCHECK(!task_runner_provider_->IsMainThreadBlocked());
|
| + task_runner_provider_->SetMainThreadBlocked(true);
|
| + }
|
| + ~DebugScopedSetMainThreadBlocked() {
|
| + DCHECK(task_runner_provider_->IsMainThreadBlocked());
|
| + task_runner_provider_->SetMainThreadBlocked(false);
|
| + }
|
| +
|
| + private:
|
| + TaskRunnerProvider* task_runner_provider_;
|
| + DISALLOW_COPY_AND_ASSIGN(DebugScopedSetMainThreadBlocked);
|
| +};
|
| +#else
|
| +class DebugScopedSetMainThreadBlocked {
|
| + public:
|
| + explicit DebugScopedSetMainThreadBlocked(
|
| + TaskRunnerProvider* task_runner_provider) {}
|
| + ~DebugScopedSetMainThreadBlocked() {}
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(DebugScopedSetMainThreadBlocked);
|
| +};
|
| +#endif
|
| +
|
| +} // namespace cc
|
| +
|
| +#endif // CC_TREES_TASK_RUNNER_PROVIDER_H_
|
|
|