diff options
Diffstat (limited to 'cpp/src/Ice/ObjectFactoryManager.cpp')
-rw-r--r-- | cpp/src/Ice/ObjectFactoryManager.cpp | 40 |
1 files changed, 28 insertions, 12 deletions
diff --git a/cpp/src/Ice/ObjectFactoryManager.cpp b/cpp/src/Ice/ObjectFactoryManager.cpp index 38381091bb8..02a646cbfce 100644 --- a/cpp/src/Ice/ObjectFactoryManager.cpp +++ b/cpp/src/Ice/ObjectFactoryManager.cpp @@ -15,6 +15,7 @@ #include <Ice/ObjectFactoryManager.h> #include <Ice/ObjectFactory.h> #include <Ice/Functional.h> +#include <Ice/LocalException.h> using namespace std; using namespace Ice; @@ -27,6 +28,16 @@ void IceInternal::ObjectFactoryManager::add(const ObjectFactoryPtr& factory, const string& id) { IceUtil::Mutex::Lock sync(*this); + + if( (_factoryMapHint != _factoryMap.end() && _factoryMapHint->first == id) + || _factoryMap.find(id) != _factoryMap.end()) + { + AlreadyRegisteredException ex(__FILE__, __LINE__); + ex.kindOfObject = _kindOfObject; + ex.id = id; + throw ex; + } + _factoryMapHint = _factoryMap.insert(_factoryMapHint, make_pair(id, factory)); } @@ -48,21 +59,26 @@ IceInternal::ObjectFactoryManager::remove(const string& id) if(p == _factoryMap.end()) { p = _factoryMap.find(id); + if(p == _factoryMap.end()) + { + NotRegisteredException ex(__FILE__, __LINE__); + ex.kindOfObject = _kindOfObject; + ex.id = id; + throw ex; + } } + assert(p != _factoryMap.end()); - if(p != _factoryMap.end()) - { - p->second->destroy(); + p->second->destroy(); - if(p == _factoryMapHint) - { - _factoryMap.erase(p++); - _factoryMapHint = p; - } - else - { - _factoryMap.erase(p); - } + if(p == _factoryMapHint) + { + _factoryMap.erase(p); + _factoryMapHint = ++p; + } + else + { + _factoryMap.erase(p); } } |