diff options
Diffstat (limited to 'ppapi/shared_impl/proxy_lock.h')
-rw-r--r-- | ppapi/shared_impl/proxy_lock.h | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/ppapi/shared_impl/proxy_lock.h b/ppapi/shared_impl/proxy_lock.h new file mode 100644 index 0000000..aa6120e --- /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_ |