- threadsafe cache manager and recursive checking in xml loader (possible fix for issue experienced by james in windows build)

This commit is contained in:
Mark Vejvoda 2011-07-08 15:17:50 +00:00
parent cd0ce1d840
commit 3584a831cf
3 changed files with 27 additions and 14 deletions

View File

@ -38,6 +38,8 @@ static const char *getFolderTreeContentsCheckSumListRecursivelyCacheLookupKey1;
static const char *getFolderTreeContentsCheckSumListRecursivelyCacheLookupKey2;
protected:
static std::map<string, Mutex *> itemCacheMutexList;
typedef enum {
cacheItemGet,
cacheItemSet
@ -45,13 +47,11 @@ protected:
template <typename T>
static Mutex & manageCachedItemMutex(string cacheKey) {
// Here is the actual type-safe instantiation
static std::map<string, Mutex> 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 <typename T>
@ -84,13 +84,22 @@ protected:
}
}
// If this is the first access we return a default object of the type
Mutex &mutexCache = manageCachedItemMutex<T>(cacheKey);
MutexSafeWrapper safeMutex(&mutexCache);
return itemCache[cacheKey];
}
public:
CacheManager() { }
~CacheManager() { }
~CacheManager() {
for(std::map<string, Mutex *>::iterator iterMap = itemCacheMutexList.begin();
iterMap != itemCacheMutexList.end(); iterMap++) {
delete iterMap->second;
iterMap->second = NULL;
}
}
template <typename T>
static void setCachedItem(string cacheKey, const T value) {

View File

@ -14,6 +14,7 @@
namespace Shared { namespace PlatformCommon {
//Mutex CacheManager::mutexCache;
std::map<string, Mutex *> CacheManager::itemCacheMutexList;
const char *CacheManager::getFolderTreeContentsCheckSumRecursivelyCacheLookupKey1 = "CRC_Cache_FileTree1";
const char *CacheManager::getFolderTreeContentsCheckSumRecursivelyCacheLookupKey2 = "CRC_Cache_FileTree2";
const char *CacheManager::getFolderTreeContentsCheckSumListRecursivelyCacheLookupKey1 = "CRC_Cache_FileTreeList1";

View File

@ -176,16 +176,16 @@ void XmlTree::init(const string &name){
}
typedef std::vector<XmlTree*> 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<string,string> mapTagReplacementValues) {
//printf("XmlTree::load p [%p]\n",this);
assert(!loadPath.size());
//LoadStack &loadStack = CacheManager::getCachedItem<LoadStack>(loadStackCacheName);
//Mutex &mutex = CacheManager::getMutexForItem<LoadStack>(loadStackCacheName);
//MutexSafeWrapper safeMutex(&mutex);
LoadStack &loadStack = CacheManager::getCachedItem<LoadStack>(loadStackCacheName);
Mutex &mutex = CacheManager::getMutexForItem<LoadStack>(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<string,string> 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<LoadStack>(loadStackCacheName);
//Mutex &mutex = CacheManager::getMutexForItem<LoadStack>(loadStackCacheName);
//MutexSafeWrapper safeMutex(&mutex);
LoadStack &loadStack = CacheManager::getCachedItem<LoadStack>(loadStackCacheName);
Mutex &mutex = CacheManager::getMutexForItem<LoadStack>(loadStackCacheName);
MutexSafeWrapper safeMutex(&mutex);
LoadStack::iterator it= find(loadStack.begin(),loadStack.end(),this);
if(it != loadStack.end()) {
loadStack.erase(it);
}
safeMutex.ReleaseLock();
delete rootNode;
}