Adjust Lock API
authorScott Cantor <cantor.2@osu.edu>
Sat, 24 Dec 2011 21:45:21 +0000 (21:45 +0000)
committerScott Cantor <cantor.2@osu.edu>
Sat, 24 Dec 2011 21:45:21 +0000 (21:45 +0000)
xmltooling/XMLToolingConfig.cpp
xmltooling/internal.h
xmltooling/util/ParserPool.cpp
xmltooling/util/Threads.h

index 6760d9e..bd7fbcb 100644 (file)
@@ -294,7 +294,6 @@ XMLToolingInternalConfig::XMLToolingInternalConfig() :
 
 XMLToolingInternalConfig::~XMLToolingInternalConfig()
 {
-    delete m_lock;
 }
 
 bool XMLToolingInternalConfig::log_config(const char* config)
index c486b10..bf879f3 100644 (file)
@@ -132,7 +132,7 @@ namespace xmltooling {
 
     private:
         int m_initCount;
-        Mutex* m_lock;
+        std::auto_ptr<Mutex> m_lock;
         std::map<std::string,Mutex*> m_namedLocks;
         std::vector<void*> m_libhandles;
         ParserPool* m_parserPool;
index ca155ca..42fc535 100644 (file)
@@ -229,7 +229,7 @@ bool ParserPool::loadSchema(const XMLCh* nsURI, const XMLCh* pathname)
         return false;
     }
 
-    Lock lock(m_lock.get());
+    Lock lock(m_lock);
     m_schemaLocMap[nsURI]=pathname;
     m_schemaLocations.erase();
     for_each(m_schemaLocMap.begin(), m_schemaLocMap.end(), doubleit<xstring>(m_schemaLocations,chSpace));
@@ -302,7 +302,7 @@ bool ParserPool::loadCatalog(const XMLCh* pathname)
 
         // Fetch all the <system> elements.
         DOMNodeList* mappings=root->getElementsByTagNameNS(CATALOG_NS,system);
-        Lock lock(m_lock.get());
+        Lock lock(m_lock);
         for (XMLSize_t i=0; i<mappings->getLength(); i++) {
             root=static_cast<DOMElement*>(mappings->item(i));
             const XMLCh* from=root->getAttributeNS(nullptr,systemId);
@@ -400,7 +400,7 @@ DOMLSParser* ParserPool::createBuilder()
 
 DOMLSParser* ParserPool::checkoutBuilder()
 {
-    Lock lock(m_lock.get());
+    Lock lock(m_lock);
     if (m_pool.empty()) {
         DOMLSParser* builder=createBuilder();
         return builder;
@@ -415,7 +415,7 @@ DOMLSParser* ParserPool::checkoutBuilder()
 void ParserPool::checkinBuilder(DOMLSParser* builder)
 {
     if (builder) {
-        Lock lock(m_lock.get());
+        Lock lock(m_lock);
         m_pool.push(builder);
     }
 }
@@ -447,7 +447,7 @@ DOMBuilder* ParserPool::createBuilder()
 
 DOMBuilder* ParserPool::checkoutBuilder()
 {
-    Lock lock(m_lock.get());
+    Lock lock(m_lock);
     if (m_pool.empty()) {
         DOMBuilder* builder=createBuilder();
         return builder;
@@ -462,7 +462,7 @@ DOMBuilder* ParserPool::checkoutBuilder()
 void ParserPool::checkinBuilder(DOMBuilder* builder)
 {
     if (builder) {
-        Lock lock(m_lock.get());
+        Lock lock(m_lock);
         m_pool.push(builder);
     }
 }
index 959031d..5269763 100644 (file)
@@ -29,6 +29,7 @@
 
 #include <xmltooling/exceptions.h>
 
+#include <memory>
 #include <signal.h>
 
 namespace xmltooling
@@ -305,6 +306,16 @@ namespace xmltooling
         }
 
         /**
+         * Locks and wraps the designated mutex.
+         *
+         * @param mtx mutex to lock
+         */
+        Lock(std::auto_ptr<Mutex>& mtx) : mutex(mtx.get()) {
+            if (mutex)
+                mutex->lock();
+        }
+
+        /**
          * Unlocks the wrapped mutex.
          */
         ~Lock() {
@@ -334,6 +345,17 @@ namespace xmltooling
         }
 
         /**
+         * Locks and wraps the designated shared lock.
+         *
+         * @param lock      lock to acquire
+         * @param lockit    true if the lock should be acquired here, false if already acquired
+         */
+        SharedLock(std::auto_ptr<RWLock>& lock, bool lockit=true) : rwlock(lock.get()) {
+            if (rwlock && lockit)
+                rwlock->rdlock();
+        }
+
+        /**
          * Unlocks the wrapped shared lock.
          */
         ~SharedLock() {