/**\r
* Lock the associated object for exclusive access.\r
* \r
- * @return a reference to the object being locked\r
+ * @return a pointer to the object being locked\r
*/\r
- virtual Lockable& lock()=0;\r
+ virtual Lockable* lock()=0;\r
\r
/**\r
* Unlock the associated object from exclusive access.\r
MAKE_NONCOPYABLE(Locker);\r
public:\r
/**\r
- * Locks an object and stores it for later release.\r
+ * Optionally locks an object and stores it for later release.\r
* \r
- * @param lockee Pointer to an object to lock and hold\r
+ * @param lockee pointer to an object to hold, and optionally lock\r
+ * @param lock true iff object is not yet locked\r
*/\r
- Locker(Lockable* lockee) : m_lockee(lockee->lock()) {}\r
- \r
+ Locker(Lockable* lockee=NULL, bool lock=true) {\r
+ if (lockee && lock)\r
+ m_lockee=lockee->lock();\r
+ else\r
+ m_lockee=lockee;\r
+ }\r
+\r
/**\r
- * Locks an object and stores it for later release.\r
+ * Optionally locks an object and stores it for later release.\r
+ * If an object is already held, it is unlocked and detached.\r
* \r
- * @param lockee Reference to an object to lock and hold\r
+ * @param lockee pointer to an object to hold, and optionally lock\r
+ * @param lock true iff object is not yet locked\r
*/\r
- Locker(Lockable& lockee) : m_lockee(lockee.lock()) {}\r
-\r
+ void assign(Lockable* lockee=NULL, bool lock=true) {\r
+ if (m_lockee)\r
+ m_lockee->unlock();\r
+ m_lockee=NULL;\r
+ if (lockee && lock)\r
+ m_lockee=lockee->lock();\r
+ else\r
+ m_lockee=lockee;\r
+ }\r
+ \r
/**\r
- * Releases lock on held pointer, if any.\r
+ * Destructor releases lock on held pointer, if any.\r
*/\r
- ~Locker() {m_lockee.unlock();}\r
+ ~Locker() {\r
+ if (m_lockee)\r
+ m_lockee->unlock();\r
+ }\r
+ \r
private:\r
- Lockable& m_lockee;\r
+ Lockable* m_lockee;\r
};\r
\r
};\r