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(); |