summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/ObjectFactoryManager.cpp
diff options
context:
space:
mode:
authorBernard Normier <bernard@zeroc.com>2006-06-15 16:48:28 +0000
committerBernard Normier <bernard@zeroc.com>2006-06-15 16:48:28 +0000
commit933f607ee28ff7fcdc5d1b1f59c1fdc8278d770c (patch)
tree6480c82524d60aa531f35e5e3ed11745192cf2f7 /cpp/src/Ice/ObjectFactoryManager.cpp
parentPartial fix bug #472 (diff)
downloadice-933f607ee28ff7fcdc5d1b1f59c1fdc8278d770c.tar.bz2
ice-933f607ee28ff7fcdc5d1b1f59c1fdc8278d770c.tar.xz
ice-933f607ee28ff7fcdc5d1b1f59c1fdc8278d770c.zip
Partial fix for bug #472
Diffstat (limited to 'cpp/src/Ice/ObjectFactoryManager.cpp')
-rw-r--r--cpp/src/Ice/ObjectFactoryManager.cpp78
1 files changed, 47 insertions, 31 deletions
diff --git a/cpp/src/Ice/ObjectFactoryManager.cpp b/cpp/src/Ice/ObjectFactoryManager.cpp
index b74bc0cec18..1f368b278c3 100644
--- a/cpp/src/Ice/ObjectFactoryManager.cpp
+++ b/cpp/src/Ice/ObjectFactoryManager.cpp
@@ -1,3 +1,4 @@
+
// **********************************************************************
//
// Copyright (c) 2003-2006 ZeroC, Inc. All rights reserved.
@@ -39,41 +40,50 @@ IceInternal::ObjectFactoryManager::add(const ObjectFactoryPtr& factory, const st
void
IceInternal::ObjectFactoryManager::remove(const string& id)
{
- IceUtil::Mutex::Lock sync(*this);
-
- FactoryMap::iterator p = _factoryMap.end();
- if(_factoryMapHint != _factoryMap.end())
+ ObjectFactoryPtr factory = 0;
{
- if(_factoryMapHint->first == id)
+ IceUtil::Mutex::Lock sync(*this);
+
+ FactoryMap::iterator p = _factoryMap.end();
+ if(_factoryMapHint != _factoryMap.end())
{
- p = _factoryMapHint;
+ if(_factoryMapHint->first == id)
+ {
+ p = _factoryMapHint;
+ }
}
- }
-
- if(p == _factoryMap.end())
- {
- p = _factoryMap.find(id);
+
if(p == _factoryMap.end())
{
- NotRegisteredException ex(__FILE__, __LINE__);
- ex.kindOfObject = "object factory";
- ex.id = id;
- throw ex;
+ p = _factoryMap.find(id);
+ if(p == _factoryMap.end())
+ {
+ NotRegisteredException ex(__FILE__, __LINE__);
+ ex.kindOfObject = "object factory";
+ ex.id = id;
+ throw ex;
+ }
+ }
+ assert(p != _factoryMap.end());
+
+ factory = p->second;
+
+ if(p == _factoryMapHint)
+ {
+ _factoryMap.erase(p++);
+ _factoryMapHint = p;
+ }
+ else
+ {
+ _factoryMap.erase(p);
}
}
- assert(p != _factoryMap.end());
- p->second->destroy();
-
- if(p == _factoryMapHint)
- {
- _factoryMap.erase(p++);
- _factoryMapHint = p;
- }
- else
- {
- _factoryMap.erase(p);
- }
+ //
+ // Destroy outside the lock
+ //
+ assert(factory != 0);
+ factory->destroy();
}
ObjectFactoryPtr
@@ -116,10 +126,16 @@ IceInternal::ObjectFactoryManager::ObjectFactoryManager() :
void
IceInternal::ObjectFactoryManager::destroy()
{
- IceUtil::Mutex::Lock sync(*this);
+ FactoryMap oldMap;
+ {
+ IceUtil::Mutex::Lock sync(*this);
+ oldMap.swap(_factoryMap);
+ _factoryMapHint = _factoryMap.end();
+ }
- for_each(_factoryMap.begin(), _factoryMap.end(),
+ //
+ // Destroy all outside lock
+ //
+ for_each(oldMap.begin(), oldMap.end(),
Ice::secondVoidMemFun<const string, ObjectFactory>(&ObjectFactory::destroy));
- _factoryMap.clear();
- _factoryMapHint = _factoryMap.end();
}