| Index: ppapi/shared_impl/proxy_lock.cc
|
| diff --git a/ppapi/shared_impl/proxy_lock.cc b/ppapi/shared_impl/proxy_lock.cc
|
| index 7b9bc9137c1ef9930605ef0d2b4575db204a6865..3c1c3473ae420b11670087467aa5cb099a75457d 100644
|
| --- a/ppapi/shared_impl/proxy_lock.cc
|
| +++ b/ppapi/shared_impl/proxy_lock.cc
|
| @@ -11,14 +11,33 @@
|
|
|
| namespace ppapi {
|
|
|
| +base::LazyInstance<base::Lock>::Leaky
|
| + g_proxy_lock = LAZY_INSTANCE_INITIALIZER;
|
| +
|
| +bool g_disable_locking = false;
|
| +base::LazyInstance<base::ThreadLocalBoolean>::Leaky
|
| + g_disable_locking_for_thread = LAZY_INSTANCE_INITIALIZER;
|
| +
|
| // Simple single-thread deadlock detector for the proxy lock.
|
| // |true| when the current thread has the lock.
|
| base::LazyInstance<base::ThreadLocalBoolean>::Leaky
|
| g_proxy_locked_on_thread = LAZY_INSTANCE_INITIALIZER;
|
|
|
| // static
|
| +base::Lock* ProxyLock::Get() {
|
| + if (g_disable_locking || g_disable_locking_for_thread.Get().Get())
|
| + return NULL;
|
| + return &g_proxy_lock.Get();
|
| +}
|
| +
|
| +// Functions below should only access the lock via Get to ensure that they don't
|
| +// try to use the lock on the host side of the proxy, where locking is
|
| +// unnecessary and wrong (because we haven't coded the host side to account for
|
| +// locking).
|
| +
|
| +// static
|
| void ProxyLock::Acquire() {
|
| - base::Lock* lock(PpapiGlobals::Get()->GetProxyLock());
|
| + base::Lock* lock = Get();
|
| if (lock) {
|
| // This thread does not already hold the lock.
|
| const bool deadlock = g_proxy_locked_on_thread.Get().Get();
|
| @@ -31,7 +50,7 @@ void ProxyLock::Acquire() {
|
|
|
| // static
|
| void ProxyLock::Release() {
|
| - base::Lock* lock(PpapiGlobals::Get()->GetProxyLock());
|
| + base::Lock* lock = Get();
|
| if (lock) {
|
| // This thread currently holds the lock.
|
| const bool locked = g_proxy_locked_on_thread.Get().Get();
|
| @@ -44,7 +63,7 @@ void ProxyLock::Release() {
|
|
|
| // static
|
| void ProxyLock::AssertAcquired() {
|
| - base::Lock* lock(PpapiGlobals::Get()->GetProxyLock());
|
| + base::Lock* lock = Get();
|
| if (lock) {
|
| // This thread currently holds the lock.
|
| const bool locked = g_proxy_locked_on_thread.Get().Get();
|
| @@ -54,6 +73,25 @@ void ProxyLock::AssertAcquired() {
|
| }
|
| }
|
|
|
| +// static
|
| +void ProxyLock::DisableLocking() {
|
| + // Note, we don't DCHECK that this flag isn't already set, because multiple
|
| + // unit tests may run in succession and all set it.
|
| + g_disable_locking = true;
|
| +}
|
| +
|
| +// static
|
| +void ProxyLock::DisableLockingOnThreadForTest() {
|
| + // Note, we don't DCHECK that this flag isn't already set, because multiple
|
| + // unit tests may run in succession and all set it.
|
| + g_disable_locking_for_thread.Get().Set(true);
|
| +}
|
| +
|
| +// static
|
| +void ProxyLock::EnableLockingOnThreadForTest() {
|
| + g_disable_locking_for_thread.Get().Set(false);
|
| +}
|
| +
|
| void CallWhileUnlocked(const base::Closure& closure) {
|
| ProxyAutoUnlock lock;
|
| closure.Run();
|
|
|