Migrate to updated reloadable-file APIs.
authorcantor <cantor@cb58f699-b61c-0410-a6fe-9272a202ed29>
Thu, 1 Apr 2010 01:15:55 +0000 (01:15 +0000)
committercantor <cantor@cb58f699-b61c-0410-a6fe-9272a202ed29>
Thu, 1 Apr 2010 01:15:55 +0000 (01:15 +0000)
git-svn-id: https://svn.middleware.georgetown.edu/cpp-sp/branches/REL_2@3245 cb58f699-b61c-0410-a6fe-9272a202ed29

shibsp/attribute/filtering/impl/XMLAttributeFilter.cpp
shibsp/attribute/resolver/impl/XMLAttributeExtractor.cpp
shibsp/impl/XMLAccessControl.cpp
shibsp/impl/XMLRequestMapper.cpp
shibsp/impl/XMLServiceProvider.cpp

index 67abf9b..2e5183f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Copyright 2001-2009 Internet2
+ *  Copyright 2001-2010 Internet2
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -33,6 +33,7 @@
 
 #include <xmltooling/util/NDC.h>
 #include <xmltooling/util/ReloadableXMLFile.h>
+#include <xmltooling/util/Threads.h>
 #include <xmltooling/util/XMLHelper.h>
 #include <xercesc/util/XMLUniDefs.hpp>
 
@@ -99,7 +100,7 @@ namespace shibsp {
     {
     public:
         XMLFilter(const DOMElement* e) : ReloadableXMLFile(e, Category::getInstance(SHIBSP_LOGCAT".AttributeFilter")), m_impl(NULL) {
-            load();
+            background_load();
         }
         ~XMLFilter() {
             delete m_impl;
@@ -110,7 +111,7 @@ namespace shibsp {
         }
 
     protected:
-        pair<bool,DOMElement*> load();
+        pair<bool,DOMElement*> background_load();
 
     private:
         XMLFilterImpl* m_impl;
@@ -456,7 +457,7 @@ void XMLFilterImpl::filterAttributes(const FilteringContext& context, vector<Att
     }
 }
 
-pair<bool,DOMElement*> XMLFilter::load()
+pair<bool,DOMElement*> XMLFilter::background_load()
 {
     // Load from source using base class.
     pair<bool,DOMElement*> raw = ReloadableXMLFile::load();
@@ -469,6 +470,10 @@ pair<bool,DOMElement*> XMLFilter::load()
     // If we held the document, transfer it to the impl. If we didn't, it's a no-op.
     impl->setDocument(docjanitor.release());
 
+    // Perform the swap inside a lock.
+    if (m_lock)
+        m_lock->wrlock();
+    SharedLock locker(m_lock, false);
     delete m_impl;
     m_impl = impl;
 
index 9b9d98d..a61e67b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Copyright 2001-2009 Internet2
+ *  Copyright 2001-2010 Internet2
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -180,7 +180,7 @@ namespace shibsp {
     {
     public:
         XMLExtractor(const DOMElement* e) : ReloadableXMLFile(e, Category::getInstance(SHIBSP_LOGCAT".AttributeExtractor.XML")), m_impl(NULL) {
-            load();
+            background_load();
         }
         ~XMLExtractor() {
             delete m_impl;
@@ -196,7 +196,7 @@ namespace shibsp {
         }
 
     protected:
-        pair<bool,DOMElement*> load();
+        pair<bool,DOMElement*> background_load();
 
     private:
         XMLExtractorImpl* m_impl;
@@ -981,7 +981,7 @@ void XMLExtractor::extractAttributes(
     throw AttributeExtractionException("Unable to extract attributes, unknown object type.");
 }
 
-pair<bool,DOMElement*> XMLExtractor::load()
+pair<bool,DOMElement*> XMLExtractor::background_load()
 {
     // Load from source using base class.
     pair<bool,DOMElement*> raw = ReloadableXMLFile::load();
@@ -994,6 +994,10 @@ pair<bool,DOMElement*> XMLExtractor::load()
     // If we held the document, transfer it to the impl. If we didn't, it's a no-op.
     impl->setDocument(docjanitor.release());
 
+    // Perform the swap inside a lock.
+    if (m_lock)
+        m_lock->wrlock();
+    SharedLock locker(m_lock, false);
     delete m_impl;
     m_impl = impl;
 
index 7e08b73..f46015c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Copyright 2001-2009 Internet2
+ *  Copyright 2001-2010 Internet2
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -30,6 +30,7 @@
 #include <algorithm>
 #include <xmltooling/unicode.h>
 #include <xmltooling/util/ReloadableXMLFile.h>
+#include <xmltooling/util/Threads.h>
 #include <xmltooling/util/XMLHelper.h>
 #include <xercesc/util/XMLUniDefs.hpp>
 #include <xercesc/util/regx/RegularExpression.hpp>
@@ -105,7 +106,7 @@ namespace shibsp {
     public:
         XMLAccessControl(const DOMElement* e)
                 : ReloadableXMLFile(e, Category::getInstance(SHIBSP_LOGCAT".AccessControl.XML")), m_rootAuthz(NULL) {
-            load(); // guarantees an exception or the policy is loaded
+            background_load(); // guarantees an exception or the policy is loaded
         }
 
         ~XMLAccessControl() {
@@ -115,7 +116,7 @@ namespace shibsp {
         aclresult_t authorized(const SPRequest& request, const Session* session) const;
 
     protected:
-        pair<bool,DOMElement*> load();
+        pair<bool,DOMElement*> background_load();
 
     private:
         AccessControl* m_rootAuthz;
@@ -414,7 +415,7 @@ AccessControl::aclresult_t Operator::authorized(const SPRequest& request, const
     return shib_acl_false;
 }
 
-pair<bool,DOMElement*> XMLAccessControl::load()
+pair<bool,DOMElement*> XMLAccessControl::background_load()
 {
     // Load from source using base class.
     pair<bool,DOMElement*> raw = ReloadableXMLFile::load();
@@ -434,8 +435,13 @@ pair<bool,DOMElement*> XMLAccessControl::load()
     else
         authz=new Operator(raw.second);
 
+    // Perform the swap inside a lock.
+    if (m_lock)
+        m_lock->wrlock();
+    SharedLock locker(m_lock, false);
     delete m_rootAuthz;
     m_rootAuthz = authz;
+
     return make_pair(false,(DOMElement*)NULL);
 }
 
index 9c3a0c4..a57ee65 100644 (file)
@@ -30,6 +30,7 @@
 #include <algorithm>
 #include <xmltooling/util/NDC.h>
 #include <xmltooling/util/ReloadableXMLFile.h>
+#include <xmltooling/util/Threads.h>
 #include <xmltooling/util/XMLHelper.h>
 #include <xercesc/util/XMLUniDefs.hpp>
 #include <xercesc/util/regx/RegularExpression.hpp>
@@ -116,7 +117,7 @@ namespace shibsp {
     {
     public:
         XMLRequestMapper(const DOMElement* e) : ReloadableXMLFile(e,Category::getInstance(SHIBSP_LOGCAT".RequestMapper")), m_impl(NULL) {
-            load();
+            background_load();
         }
 
         ~XMLRequestMapper() {
@@ -126,7 +127,7 @@ namespace shibsp {
         Settings getSettings(const HTTPRequest& request) const;
 
     protected:
-        pair<bool,DOMElement*> load();
+        pair<bool,DOMElement*> background_load();
 
     private:
         XMLRequestMapperImpl* m_impl;
@@ -630,7 +631,7 @@ const Override* XMLRequestMapperImpl::findOverride(const char* vhost, const HTTP
     return o ? o->locate(request) : this;
 }
 
-pair<bool,DOMElement*> XMLRequestMapper::load()
+pair<bool,DOMElement*> XMLRequestMapper::background_load()
 {
     // Load from source using base class.
     pair<bool,DOMElement*> raw = ReloadableXMLFile::load();
@@ -638,11 +639,15 @@ pair<bool,DOMElement*> XMLRequestMapper::load()
     // If we own it, wrap it.
     XercesJanitor<DOMDocument> docjanitor(raw.first ? raw.second->getOwnerDocument() : NULL);
 
-    XMLRequestMapperImpl* impl = new XMLRequestMapperImpl(raw.second,m_log);
+    XMLRequestMapperImpl* impl = new XMLRequestMapperImpl(raw.second, m_log);
 
     // If we held the document, transfer it to the impl. If we didn't, it's a no-op.
     impl->setDocument(docjanitor.release());
 
+    // Perform the swap inside a lock.
+    if (m_lock)
+        m_lock->wrlock();
+    SharedLock locker(m_lock, false);
     delete m_impl;
     m_impl = impl;
 
index 9f86df3..dfd01f5 100644 (file)
@@ -49,6 +49,7 @@
 #include <xmltooling/util/NDC.h>
 #include <xmltooling/util/ReloadableXMLFile.h>
 #include <xmltooling/util/TemplateEngine.h>
+#include <xmltooling/util/Threads.h>
 #include <xmltooling/util/XMLHelper.h>
 
 #ifndef SHIBSP_LITE
@@ -292,7 +293,7 @@ namespace {
         }
 
         void init() {
-            load();
+            background_load();
         }
 
         ~XMLConfig() {
@@ -392,7 +393,7 @@ namespace {
 #endif
 
     protected:
-        pair<bool,DOMElement*> load();
+        pair<bool,DOMElement*> background_load();
 
     private:
         friend class XMLConfigImpl;
@@ -1725,7 +1726,7 @@ void XMLConfig::receive(DDF& in, ostream& out)
 }
 #endif
 
-pair<bool,DOMElement*> XMLConfig::load()
+pair<bool,DOMElement*> XMLConfig::background_load()
 {
     // Load from source using base class.
     pair<bool,DOMElement*> raw = ReloadableXMLFile::load();
@@ -1733,11 +1734,15 @@ pair<bool,DOMElement*> XMLConfig::load()
     // If we own it, wrap it.
     XercesJanitor<DOMDocument> docjanitor(raw.first ? raw.second->getOwnerDocument() : NULL);
 
-    XMLConfigImpl* impl = new XMLConfigImpl(raw.second,(m_impl==NULL),this,m_log);
+    XMLConfigImpl* impl = new XMLConfigImpl(raw.second, (m_impl==NULL), this, m_log);
 
     // If we held the document, transfer it to the impl. If we didn't, it's a no-op.
     impl->setDocument(docjanitor.release());
 
+    // Perform the swap inside a lock.
+    if (m_lock)
+        m_lock->wrlock();
+    SharedLock locker(m_lock, false);
     delete m_impl;
     m_impl = impl;