From 261170cc5b6661106877dc2611dab281f4d91348 Mon Sep 17 00:00:00 2001 From: Adrian Kummerländer Date: Sat, 3 May 2014 22:04:16 +0200 Subject: 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 --- src/support/xerces_string_guard.h | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) (limited to 'src/support/xerces_string_guard.h') diff --git a/src/support/xerces_string_guard.h b/src/support/xerces_string_guard.h index f64a53e..7b9517a 100644 --- a/src/support/xerces_string_guard.h +++ b/src/support/xerces_string_guard.h @@ -7,15 +7,33 @@ namespace InputXSLT { +template class XercesStringGuard { public: - XercesStringGuard(const std::string&); - ~XercesStringGuard(); - - XMLCh* operator*(); + XercesStringGuard(const Type* src): + string_(src) { } + + XercesStringGuard( + const std::basic_string< + typename std::remove_pointer::type + >& src + ): + string_(xercesc::XMLString::transcode(src.data())) { } + + ~XercesStringGuard() { + xercesc::XMLString::release( + const_cast(&this->string_) + ); + } + + inline const Type* operator*() const { + return this->string_; + } private: - XMLCh* const string_; + const Type* const string_; }; -- cgit v1.2.3