This commit is contained in:
JoelKatz
2011-12-30 23:16:07 -08:00
parent 812df57fcf
commit ecd63370f6

View File

@@ -9,44 +9,62 @@
class ScopedLock class ScopedLock
{ {
private: private:
boost::recursive_mutex *mMutex; // parent object has greater scope, so guaranteed valid boost::recursive_mutex *mMutex; // parent object has greater scope, so guaranteed valid
mutable bool mValid; mutable bool mValid;
ScopedLock(); // no implementation
ScopedLock(); // no implementation
public: public:
ScopedLock(boost::recursive_mutex &mutex) : mMutex(&mutex), mValid(true) ScopedLock(boost::recursive_mutex &mutex) : mMutex(&mutex), mValid(true)
{ {
mMutex->lock(); mMutex->lock();
} }
~ScopedLock() ~ScopedLock()
{ {
if(mValid) mMutex->unlock(); if(mValid) mMutex->unlock();
} }
ScopedLock(const ScopedLock &sl) ScopedLock(const ScopedLock &sl)
{ {
mMutex=sl.mMutex; mMutex=sl.mMutex;
if(sl.mValid) if(sl.mValid)
{ {
mValid=true; mValid=true;
sl.mValid=false; sl.mValid=false;
} }
else mValid=false; else mValid=false;
} }
ScopedLock &operator=(const ScopedLock &sl) ScopedLock &operator=(const ScopedLock &sl)
{ // we inherit any lock the other class member had { // we inherit any lock the other class member had
if(mValid) mMutex->unlock(); if(mMutex!=sl.mMutex)
mMutex=sl.mMutex; {
if(sl.mValid) if(mValid) mMutex->unlock();
{ mMutex=sl.mMutex;
mValid=true; mMutex->lock();
sl.mValid=false; mValid=true;
} }
return *this; return *this;
} }
void unlock(void)
{
if(mValid)
{
mMutex->unlock();
mValid=false;
}
}
void lock(void)
{
if(mValid)
{
mMutex->lock();
mValid=true;
}
}
}; };
#endif #endif