diff options
author | Bernard Normier <bernard@zeroc.com> | 2007-11-14 15:26:38 -0500 |
---|---|---|
committer | Bernard Normier <bernard@zeroc.com> | 2007-11-14 15:26:38 -0500 |
commit | 7d6cfecf8c80394934f49c7d3201583fc8f8abf4 (patch) | |
tree | 6b387892fd50559bbc1226c05ee20f53a73be1a0 /cpp/src/Freeze/SharedDbEnv.cpp | |
parent | Merge branch 'master' of ssh://cvs.zeroc.com/home/git/ice (diff) | |
download | ice-7d6cfecf8c80394934f49c7d3201583fc8f8abf4.tar.bz2 ice-7d6cfecf8c80394934f49c7d3201583fc8f8abf4.tar.xz ice-7d6cfecf8c80394934f49c7d3201583fc8f8abf4.zip |
New Map::recreate and Freeze/transform demo
Diffstat (limited to 'cpp/src/Freeze/SharedDbEnv.cpp')
-rw-r--r-- | cpp/src/Freeze/SharedDbEnv.cpp | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/cpp/src/Freeze/SharedDbEnv.cpp b/cpp/src/Freeze/SharedDbEnv.cpp index 9b430ed1806..4ab0e365a6e 100644 --- a/cpp/src/Freeze/SharedDbEnv.cpp +++ b/cpp/src/Freeze/SharedDbEnv.cpp @@ -176,6 +176,11 @@ void Freeze::SharedDbEnv::__decRef() IceUtil::StaticMutex::Lock lock(_refCountMutex); if(--_refCount == 0) { + MapKey key; + key.envName = _envName; + key.communicator = _communicator; + + IceUtil::StaticMutex::TryLock mapLock(_mapMutex); if(!mapLock.acquired()) { @@ -185,6 +190,27 @@ void Freeze::SharedDbEnv::__decRef() lock.release(); mapLock.acquire(); lock.acquire(); + + // + // Now, maybe another thread has deleted 'this'; let's check + // we're still in the map + // + + if(sharedDbEnvMap == 0) + { + return; + } + + SharedDbEnvMap::iterator p = sharedDbEnvMap->find(key); + + if(p == sharedDbEnvMap->end() || p->second != this) + { + // + // 'this' has been deleted by another thread + // + return; + } + if(_refCount > 0) { return; @@ -194,10 +220,7 @@ void Freeze::SharedDbEnv::__decRef() // // Remove from map // - - MapKey key; - key.envName = _envName; - key.communicator = _communicator; + size_t one; one = sharedDbEnvMap->erase(key); assert(one == 1); |