Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(836)

Unified Diff: ppapi/shared_impl/proxy_lock.cc

Issue 19492014: PPAPI: Purposely leak ProxyLock, fix shutdown race (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove static initializer Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ppapi/shared_impl/proxy_lock.h ('k') | ppapi/shared_impl/resource_tracker_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
« no previous file with comments | « ppapi/shared_impl/proxy_lock.h ('k') | ppapi/shared_impl/resource_tracker_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698