diff --git a/source/shared_lib/include/platform/common/cache_manager.h b/source/shared_lib/include/platform/common/cache_manager.h index 53d82949..bb80d64c 100644 --- a/source/shared_lib/include/platform/common/cache_manager.h +++ b/source/shared_lib/include/platform/common/cache_manager.h @@ -38,6 +38,8 @@ static const char *getFolderTreeContentsCheckSumListRecursivelyCacheLookupKey1; static const char *getFolderTreeContentsCheckSumListRecursivelyCacheLookupKey2; protected: + static std::map itemCacheMutexList; + typedef enum { cacheItemGet, cacheItemSet @@ -45,13 +47,11 @@ protected: template static Mutex & manageCachedItemMutex(string cacheKey) { - // Here is the actual type-safe instantiation - static std::map itemCacheMutexList; if(itemCacheMutexList.find(cacheKey) == itemCacheMutexList.end()) { - itemCacheMutexList[cacheKey] = Mutex(); + itemCacheMutexList[cacheKey] = new Mutex(); } - Mutex &mutex = itemCacheMutexList[cacheKey]; - return mutex; + Mutex *mutex = itemCacheMutexList[cacheKey]; + return *mutex; } template @@ -84,13 +84,22 @@ protected: } } // If this is the first access we return a default object of the type + Mutex &mutexCache = manageCachedItemMutex(cacheKey); + MutexSafeWrapper safeMutex(&mutexCache); + return itemCache[cacheKey]; } public: CacheManager() { } - ~CacheManager() { } + ~CacheManager() { + for(std::map::iterator iterMap = itemCacheMutexList.begin(); + iterMap != itemCacheMutexList.end(); iterMap++) { + delete iterMap->second; + iterMap->second = NULL; + } + } template static void setCachedItem(string cacheKey, const T value) { diff --git a/source/shared_lib/sources/platform/common/cache_manager.cpp b/source/shared_lib/sources/platform/common/cache_manager.cpp index cad6862c..dbdcfb66 100644 --- a/source/shared_lib/sources/platform/common/cache_manager.cpp +++ b/source/shared_lib/sources/platform/common/cache_manager.cpp @@ -14,6 +14,7 @@ namespace Shared { namespace PlatformCommon { //Mutex CacheManager::mutexCache; +std::map CacheManager::itemCacheMutexList; const char *CacheManager::getFolderTreeContentsCheckSumRecursivelyCacheLookupKey1 = "CRC_Cache_FileTree1"; const char *CacheManager::getFolderTreeContentsCheckSumRecursivelyCacheLookupKey2 = "CRC_Cache_FileTree2"; const char *CacheManager::getFolderTreeContentsCheckSumListRecursivelyCacheLookupKey1 = "CRC_Cache_FileTreeList1"; diff --git a/source/shared_lib/sources/xml/xml_parser.cpp b/source/shared_lib/sources/xml/xml_parser.cpp index 90df9169..adfaea0a 100644 --- a/source/shared_lib/sources/xml/xml_parser.cpp +++ b/source/shared_lib/sources/xml/xml_parser.cpp @@ -176,16 +176,16 @@ void XmlTree::init(const string &name){ } typedef std::vector LoadStack; -static LoadStack loadStack; -//static string loadStackCacheName = string(__FILE__) + string("_loadStackCacheName"); +//static LoadStack loadStack; +static string loadStackCacheName = string(__FILE__) + string("_loadStackCacheName"); void XmlTree::load(const string &path, std::map mapTagReplacementValues) { //printf("XmlTree::load p [%p]\n",this); assert(!loadPath.size()); - //LoadStack &loadStack = CacheManager::getCachedItem(loadStackCacheName); - //Mutex &mutex = CacheManager::getMutexForItem(loadStackCacheName); - //MutexSafeWrapper safeMutex(&mutex); + LoadStack &loadStack = CacheManager::getCachedItem(loadStackCacheName); + Mutex &mutex = CacheManager::getMutexForItem(loadStackCacheName); + MutexSafeWrapper safeMutex(&mutex); for(LoadStack::iterator it= loadStack.begin(); it!= loadStack.end(); it++){ if((*it)->loadPath == path){ @@ -193,6 +193,7 @@ void XmlTree::load(const string &path, std::map mapTagReplacement } } loadStack.push_back(this); + safeMutex.ReleaseLock(); loadPath = path; this->rootNode= XmlIo::getInstance().load(path, mapTagReplacementValues); @@ -205,14 +206,16 @@ void XmlTree::save(const string &path){ XmlTree::~XmlTree() { //printf("XmlTree::~XmlTree p [%p]\n",this); - //LoadStack &loadStack = CacheManager::getCachedItem(loadStackCacheName); - //Mutex &mutex = CacheManager::getMutexForItem(loadStackCacheName); - //MutexSafeWrapper safeMutex(&mutex); + LoadStack &loadStack = CacheManager::getCachedItem(loadStackCacheName); + Mutex &mutex = CacheManager::getMutexForItem(loadStackCacheName); + MutexSafeWrapper safeMutex(&mutex); LoadStack::iterator it= find(loadStack.begin(),loadStack.end(),this); if(it != loadStack.end()) { loadStack.erase(it); } + safeMutex.ReleaseLock(); + delete rootNode; }