aboutsummaryrefslogtreecommitdiff
path: root/src/support/dom/document_cache.cc
diff options
context:
space:
mode:
authorAdrian Kummerländer2014-05-03 22:04:16 +0200
committerAdrian Kummerländer2014-05-03 22:04:16 +0200
commit261170cc5b6661106877dc2611dab281f4d91348 (patch)
tree8482f249c090af5ca462f7e36a4b87082185f027 /src/support/dom/document_cache.cc
parente5ed418907f09bf8905463f42a44593d51159bc9 (diff)
downloadInputXSLT-261170cc5b6661106877dc2611dab281f4d91348.tar
InputXSLT-261170cc5b6661106877dc2611dab281f4d91348.tar.gz
InputXSLT-261170cc5b6661106877dc2611dab281f4d91348.tar.bz2
InputXSLT-261170cc5b6661106877dc2611dab281f4d91348.tar.lz
InputXSLT-261170cc5b6661106877dc2611dab281f4d91348.tar.xz
InputXSLT-261170cc5b6661106877dc2611dab281f4d91348.tar.zst
InputXSLT-261170cc5b6661106877dc2611dab281f4d91348.zip
Revamped DomDocumentCache with regard to thread safety
* DomDocumentCache::item class now is _finalized_ by default and doesn't perform document instantiation, just lifetime management ** xercesc::DOMDocument is instantiated inside the external function implementations and committed to the document cache for conversion to a xalan document * added mutex with scoped lock to prevent concurrent write access to the std::unordered_map contained withing DomDocumentCache * functionality of the _get_ member method was split into _get_ and _create_ ** added typedef for std::pair specialization type "optional_item" that functions as the return value of _create_ and _get_ * "locator->getSystemId()" was leaking memory as xerces doesn't manage the lifetime of the returned heap-allocated char array ** analog to XMLCh* strings ** transformed XercesStringGuard into template class to be instantiated on either XMLCh or char
Diffstat (limited to 'src/support/dom/document_cache.cc')
-rw-r--r--src/support/dom/document_cache.cc32
1 files changed, 21 insertions, 11 deletions
diff --git a/src/support/dom/document_cache.cc b/src/support/dom/document_cache.cc
index 1573af8..c4c57d3 100644
--- a/src/support/dom/document_cache.cc
+++ b/src/support/dom/document_cache.cc
@@ -5,23 +5,33 @@
namespace InputXSLT {
DomDocumentCache::DomDocumentCache():
+ write_mutex_(),
map_() { }
-DomDocumentCache::item* DomDocumentCache::get(const std::string& key) {
+DomDocumentCache::optional_item DomDocumentCache::get(const std::string& key) {
auto itemIter = this->map_.find(key);
if ( itemIter == this->map_.end() ) {
- auto result = this->map_.emplace(
- std::make_pair(key, std::unique_ptr<item>(new item("content")))
- );
-
- if ( result.second ) {
- return (*(result.first)).second.get();
- } else {
- throw std::out_of_range("failed to instantiate DomDocumentCache");
- }
+ return optional_item(false, nullptr);
} else {
- return (*itemIter).second.get();
+ return optional_item(true, (*itemIter).second.get());
+ }
+}
+
+DomDocumentCache::optional_item DomDocumentCache::create(
+ const std::string& key,
+ xercesc::DOMDocument* document
+) {
+ std::lock_guard<std::mutex> guard(this->write_mutex_);
+
+ auto result = this->map_.emplace(
+ std::make_pair(key, std::unique_ptr<item>(new item(document)))
+ );
+
+ if ( result.second ) {
+ return optional_item(true, (*(result.first)).second.get());
+ } else {
+ return optional_item(false, nullptr);
}
}