mirror of
https://github.com/Xahau/xahaud.git
synced 2025-12-06 17:27:52 +00:00
85 lines
1.8 KiB
C++
85 lines
1.8 KiB
C++
//------------------------------------------------------------------------------
|
|
/*
|
|
Copyright (c) 2011-2013, OpenCoin, Inc.
|
|
*/
|
|
//==============================================================================
|
|
|
|
#ifndef RIPPLE_SCOPEDLOCK_H
|
|
#define RIPPLE_SCOPEDLOCK_H
|
|
|
|
typedef boost::recursive_mutex::scoped_lock ScopedLock;
|
|
|
|
// A lock holder that can be returned and copied by value
|
|
// When the last reference goes away, the lock is released
|
|
|
|
// VFALCO TODO replace these with a more generic template, and not use boost
|
|
//
|
|
class SharedScopedLock
|
|
{
|
|
protected:
|
|
mutable boost::shared_ptr<boost::recursive_mutex::scoped_lock> mHolder;
|
|
|
|
public:
|
|
SharedScopedLock (boost::recursive_mutex& mutex) :
|
|
mHolder (boost::make_shared<boost::recursive_mutex::scoped_lock> (boost::ref (mutex)))
|
|
{
|
|
;
|
|
}
|
|
|
|
void lock () const
|
|
{
|
|
mHolder->lock ();
|
|
}
|
|
void unlock () const
|
|
{
|
|
mHolder->unlock ();
|
|
}
|
|
};
|
|
|
|
// A class that unlocks on construction and locks on destruction
|
|
|
|
class ScopedUnlock
|
|
{
|
|
protected:
|
|
bool mUnlocked;
|
|
boost::recursive_mutex& mMutex;
|
|
|
|
public:
|
|
// VFALCO TODO get rid of this unlock parameter to restore sanity
|
|
ScopedUnlock (boost::recursive_mutex& mutex, bool unlock = true) : mUnlocked (unlock), mMutex (mutex)
|
|
{
|
|
if (unlock)
|
|
mMutex.unlock ();
|
|
}
|
|
|
|
~ScopedUnlock ()
|
|
{
|
|
if (mUnlocked)
|
|
mMutex.lock ();
|
|
}
|
|
|
|
void lock ()
|
|
{
|
|
if (mUnlocked)
|
|
{
|
|
mMutex.lock ();
|
|
mUnlocked = false;
|
|
}
|
|
}
|
|
|
|
void unlock ()
|
|
{
|
|
if (!mUnlocked)
|
|
{
|
|
mUnlocked = true;
|
|
mMutex.unlock ();
|
|
}
|
|
}
|
|
|
|
private:
|
|
ScopedUnlock (const ScopedUnlock&); // no implementation
|
|
ScopedUnlock& operator= (const ScopedUnlock&); // no implementation
|
|
};
|
|
|
|
#endif
|