Modify locking interfaces for use by metadata code.
authorScott Cantor <cantor.2@osu.edu>
Sun, 25 Jun 2006 02:54:20 +0000 (02:54 +0000)
committerScott Cantor <cantor.2@osu.edu>
Sun, 25 Jun 2006 02:54:20 +0000 (02:54 +0000)
xmltooling/Lockable.h
xmltooling/XMLToolingConfig.cpp
xmltooling/internal.h

index d7e2f26..0047a94 100644 (file)
@@ -37,9 +37,9 @@ namespace xmltooling {
         /**\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
@@ -55,25 +55,45 @@ namespace xmltooling {
     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
index 5550b65..e8e6ad8 100644 (file)
@@ -231,10 +231,10 @@ void XMLToolingInternalConfig::term()
    Category::getInstance(XMLTOOLING_LOGCAT".XMLToolingConfig").info("library shutdown complete");
 }
 
-Lockable& XMLToolingInternalConfig::lock()
+Lockable* XMLToolingInternalConfig::lock()
 {
     xercesc::XMLPlatformUtils::lockMutex(m_lock);
-    return *this;
+    return this;
 }
 
 void XMLToolingInternalConfig::unlock()
index ffc7840..49b1a35 100644 (file)
@@ -66,7 +66,7 @@ namespace xmltooling {
         void term();
 
         // global mutex available to library applications
-        Lockable& lock();
+        Lockable* lock();
         void unlock();
 
         // configuration