| // Copyright (c) 2012 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. |
| |
| #include "ppapi/shared_impl/ppapi_globals.h" |
| |
| #include "base/lazy_instance.h" // For testing purposes only. |
| #include "base/logging.h" |
| #include "base/single_thread_task_runner.h" |
| #include "base/threading/thread_local.h" // For testing purposes only. |
| #include "base/threading/thread_task_runner_handle.h" |
| |
| namespace ppapi { |
| |
| namespace { |
| // Thread-local globals for testing. See SetPpapiGlobalsOnThreadForTest for more |
| // information. |
| base::LazyInstance<base::ThreadLocalPointer<PpapiGlobals>>::Leaky |
| tls_ppapi_globals_for_test = LAZY_INSTANCE_INITIALIZER; |
| } // namespace |
| |
| PpapiGlobals* ppapi_globals = NULL; |
| |
| PpapiGlobals::PpapiGlobals() { |
| DCHECK(!ppapi_globals); |
| ppapi_globals = this; |
| main_task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
| } |
| |
| PpapiGlobals::PpapiGlobals(PerThreadForTest) { |
| DCHECK(!ppapi_globals); |
| main_task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
| } |
| |
| PpapiGlobals::~PpapiGlobals() { |
| DCHECK(ppapi_globals == this || !ppapi_globals); |
| ppapi_globals = NULL; |
| } |
| |
| // Static Getter for the global singleton. |
| PpapiGlobals* PpapiGlobals::Get() { |
| if (ppapi_globals) |
| return ppapi_globals; |
| // In unit tests, the following might be valid (see |
| // SetPpapiGlobalsOnThreadForTest). Normally, this will just return NULL. |
| return GetThreadLocalPointer(); |
| } |
| |
| // static |
| void PpapiGlobals::SetPpapiGlobalsOnThreadForTest(PpapiGlobals* ptr) { |
| // If we're using a per-thread PpapiGlobals, we should not have a global one. |
| // If we allowed it, it would always over-ride the "test" versions. |
| DCHECK(!ppapi_globals); |
| tls_ppapi_globals_for_test.Pointer()->Set(ptr); |
| } |
| |
| base::SingleThreadTaskRunner* PpapiGlobals::GetMainThreadMessageLoop() { |
| return main_task_runner_.get(); |
| } |
| |
| void PpapiGlobals::ResetMainThreadMessageLoopForTesting() { |
| main_task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
| } |
| |
| bool PpapiGlobals::IsHostGlobals() const { return false; } |
| |
| bool PpapiGlobals::IsPluginGlobals() const { return false; } |
| |
| // static |
| PpapiGlobals* PpapiGlobals::GetThreadLocalPointer() { |
| return tls_ppapi_globals_for_test.Pointer()->Get(); |
| } |
| |
| } // namespace ppapi |