Index: ppapi/shared_impl/proxy_lock.h |
diff --git a/ppapi/shared_impl/proxy_lock.h b/ppapi/shared_impl/proxy_lock.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..aa6120ef90ff7587273c5f9c21d1db88f922ee80 |
--- /dev/null |
+++ b/ppapi/shared_impl/proxy_lock.h |
@@ -0,0 +1,80 @@ |
+// Copyright (c) 2011 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 PPAPI_SHARED_IMPL_PROXY_LOCK_H_ |
+#define PPAPI_SHARED_IMPL_PROXY_LOCK_H_ |
+ |
+#include "base/basictypes.h" |
+ |
+namespace base { |
+class Lock; |
+} |
+ |
+namespace ppapi { |
+ |
+// This is the one lock to rule them all for the ppapi proxy. All PPB interface |
+// functions that need to be synchronized should lock this lock on entry. This |
+// is normally accomplished by using an appropriate Enter RAII object at the |
+// beginning of each thunk function. |
+// |
+// TODO(dmichael): If this turns out to be too slow and contentious, we'll want |
+// to use multiple locks. E.g., one for the var tracker, one for the resource |
+// tracker, etc. |
+class ProxyLock { |
+ public: |
+ // Acquire the proxy lock. If it is currently held by another thread, block |
+ // until it is available. If the lock has not been set using the 'Set' method, |
+ // this operation does nothing. That is the normal case for the host side; |
+ // see PluginResourceTracker for where the lock gets set for the out-of- |
+ // process plugin case. |
+ static void Acquire(); |
+ // Relinquish the proxy lock. If the lock has not been set, this does nothing. |
+ static void Release(); |
+ |
+ // Set the lock that ProxyLock will use. The caller is responsible for |
+ // ensuring that the lock stays valid so long as the ProxyLock may be in use. |
+ static void Set(base::Lock* lock); |
+ // Set the lock to NULL. |
+ static void Reset(); |
+ private: |
+ static base::Lock* lock_; |
+ |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(ProxyLock); |
+}; |
+ |
+// A simple RAII class for locking the PPAPI proxy lock on entry and releasing |
+// on exit. This is for simple interfaces that don't use the 'thunk' system, |
+// such as PPB_Var and PPB_Core. |
+class ProxyAutoLock { |
+ public: |
+ ProxyAutoLock() { |
+ ProxyLock::Acquire(); |
+ } |
+ ~ProxyAutoLock() { |
+ ProxyLock::Release(); |
+ } |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(ProxyAutoLock); |
+}; |
+ |
+// The inverse of the above; unlock on construction, lock on destruction. This |
+// is useful for calling out to the plugin, when we need to unlock but ensure |
+// that we re-acquire the lock when the plugin is returns or raises an |
+// exception. |
+class ProxyAutoUnlock { |
+ public: |
+ ProxyAutoUnlock() { |
+ ProxyLock::Release(); |
+ } |
+ ~ProxyAutoUnlock() { |
+ ProxyLock::Acquire(); |
+ } |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(ProxyAutoUnlock); |
+}; |
+ |
+ |
+} // namespace ppapi |
+ |
+#endif // PPAPI_SHARED_IMPL_PROXY_LOCK_H_ |