From 3452211310fdcf597957bcfee02f43cd52562a91 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 11 Nov 2011 16:32:21 -0800 Subject: [PATCH] For some reason, Boost provides no good way to return a scoped lock. It appears people usually fake it by not using RAII. This tiny bit of ugliness will make returned scope lock holders work. --- ScopedLock.h | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 ScopedLock.h diff --git a/ScopedLock.h b/ScopedLock.h new file mode 100644 index 0000000000..2d9e96e60f --- /dev/null +++ b/ScopedLock.h @@ -0,0 +1,52 @@ +#ifndef __SCOPEDLOCKHOLDER__ +#define __SCOPEDLOCKHOLDER__ + +#include "boost/thread/mutex.hpp" + +// This is a returnable lock holder. +// I don't know why Boost doesn't provide a good way to do this. + +class ScopedLock +{ +private: + boost::mutex *mMutex; // parent object has greater scope, so guaranteed valid + mutable bool mValid; + + ScopedLock(); // no implementation + +public: + ScopedLock(boost::mutex &mutex) : mMutex(&mutex), mValid(true) + { + mMutex->lock(); + } + + ~ScopedLock() + { + if(mValid) mMutex->unlock(); + } + + ScopedLock(const ScopedLock &sl) + { + mMutex=sl.mMutex; + if(sl.mValid) + { + mValid=true; + sl.mValid=false; + } + else mValid=false; + } + + ScopedLock &operator=(const ScopedLock &sl) + { // we inherit any lock the other class member had + if(mValid) mMutex->unlock(); + mMutex=sl.mMutex; + if(sl.mValid) + { + if(mValid) mMutex->unlock(); + mValid=true; + sl.mValid=false; + } + } +}; + +#endif