| 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_
|
|
|