diff options
author | Joe George <joe@zeroc.com> | 2015-03-03 17:30:50 -0500 |
---|---|---|
committer | Joe George <joe@zeroc.com> | 2015-05-12 11:41:55 -0400 |
commit | d35bb9f5c19e34aee31f83d445695a8186ef675e (patch) | |
tree | d5324eaf44f5f9776495537c51653f50a66a7237 /cpp/src/Ice/FactoryTable.cpp | |
download | ice-d35bb9f5c19e34aee31f83d445695a8186ef675e.tar.bz2 ice-d35bb9f5c19e34aee31f83d445695a8186ef675e.tar.xz ice-d35bb9f5c19e34aee31f83d445695a8186ef675e.zip |
Ice 3.4.2 Source Distributionv3.4.2
Diffstat (limited to 'cpp/src/Ice/FactoryTable.cpp')
-rw-r--r-- | cpp/src/Ice/FactoryTable.cpp | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/cpp/src/Ice/FactoryTable.cpp b/cpp/src/Ice/FactoryTable.cpp new file mode 100644 index 00000000000..527d78f7a35 --- /dev/null +++ b/cpp/src/Ice/FactoryTable.cpp @@ -0,0 +1,159 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2011 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +#include <Ice/FactoryTable.h> +#include <Ice/UserExceptionFactory.h> + +#ifdef __APPLE__ +# include <dlfcn.h> +#endif + +// +// Add a factory to the exception factory table. +// If the factory is present already, increment its reference count. +// +void +IceInternal::FactoryTable::addExceptionFactory(const std::string& t, const IceInternal::UserExceptionFactoryPtr& f) +{ + IceUtil::Mutex::Lock lock(_m); + EFTable::iterator i = _eft.find(t); + if(i == _eft.end()) + { + _eft[t] = EFPair(f, 1); + } + else + { + i->second.second++; + } +} + +// +// Return the exception factory for a given type ID +// +IceInternal::UserExceptionFactoryPtr +IceInternal::FactoryTable::getExceptionFactory(const std::string& t) const +{ + IceUtil::Mutex::Lock lock(_m); + EFTable::const_iterator i = _eft.find(t); +#ifdef __APPLE__ + if(i == _eft.end()) + { + lock.release(); + + // + // Try to find the symbol, if found this should trigger the + // object static constructors to be called. + // + std::string symbol = "__F"; + for(std::string::const_iterator p = t.begin(); p != t.end(); ++p) + { + symbol += ((*p) == ':') ? '_' : *p; + } + symbol += "__initializer"; + dlsym(RTLD_DEFAULT, symbol.c_str()); + + lock.acquire(); + + i = _eft.find(t); + } +#endif + return i != _eft.end() ? i->second.first : IceInternal::UserExceptionFactoryPtr(); +} + +// +// Remove a factory from the exception factory table. If the factory +// is not present, do nothing; otherwise, decrement the factory's +// reference count; if the count drops to zero, remove the factory's +// entry from the table. +// +void +IceInternal::FactoryTable::removeExceptionFactory(const std::string& t) +{ + IceUtil::Mutex::Lock lock(_m); + EFTable::iterator i = _eft.find(t); + if(i != _eft.end()) + { + if(--i->second.second == 0) + { + _eft.erase(i); + } + } +} + +// +// Add a factory to the object factory table. +// +void +IceInternal::FactoryTable::addObjectFactory(const std::string& t, const Ice::ObjectFactoryPtr& f) +{ + IceUtil::Mutex::Lock lock(_m); + OFTable::iterator i = _oft.find(t); + if(i == _oft.end()) + { + _oft[t] = OFPair(f, 1); + } + else + { + i->second.second++; + } +} + +// +// Return the object factory for a given type ID +// +Ice::ObjectFactoryPtr +IceInternal::FactoryTable::getObjectFactory(const std::string& t) const +{ + IceUtil::Mutex::Lock lock(_m); + OFTable::const_iterator i = _oft.find(t); +#ifdef __APPLE__ + if(i == _oft.end()) + { + lock.release(); + + // + // Try to find the symbol, if found this should trigger the + // object static constructors to be called. + // + std::string symbol = "__F"; + for(std::string::const_iterator p = t.begin(); p != t.end(); ++p) + { + symbol += ((*p) == ':') ? '_' : *p; + } + symbol += "__initializer"; + dlsym(RTLD_DEFAULT, symbol.c_str()); + + lock.acquire(); + + i = _oft.find(t); + } +#endif + return i != _oft.end() ? i->second.first : Ice::ObjectFactoryPtr(); +} + +// +// Remove a factory from the object factory table. If the factory +// is not present, do nothing; otherwise, decrement the factory's +// reference count if the count drops to zero, remove the factory's +// entry from the table. +// +void +IceInternal::FactoryTable::removeObjectFactory(const std::string& t) +{ + IceUtil::Mutex::Lock lock(_m); + OFTable::iterator i = _oft.find(t); + if(i != _oft.end()) + { + if(--i->second.second == 0) + { + _oft.erase(i); + } + } +} + |