summaryrefslogtreecommitdiff
path: root/cpp/src/Freeze/SharedDbEnv.cpp
diff options
context:
space:
mode:
authorBernard Normier <bernard@zeroc.com>2007-11-14 15:26:38 -0500
committerBernard Normier <bernard@zeroc.com>2007-11-14 15:26:38 -0500
commit7d6cfecf8c80394934f49c7d3201583fc8f8abf4 (patch)
tree6b387892fd50559bbc1226c05ee20f53a73be1a0 /cpp/src/Freeze/SharedDbEnv.cpp
parentMerge branch 'master' of ssh://cvs.zeroc.com/home/git/ice (diff)
downloadice-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.cpp31
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);