diff options
author | Bernard Normier <bernard@zeroc.com> | 2006-06-15 16:48:28 +0000 |
---|---|---|
committer | Bernard Normier <bernard@zeroc.com> | 2006-06-15 16:48:28 +0000 |
commit | 933f607ee28ff7fcdc5d1b1f59c1fdc8278d770c (patch) | |
tree | 6480c82524d60aa531f35e5e3ed11745192cf2f7 /cpp/src/Ice/ObjectFactoryManager.cpp | |
parent | Partial fix bug #472 (diff) | |
download | ice-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.cpp | 78 |
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(); } |