diff options
author | Dwayne Boone <dwayne@zeroc.com> | 2005-07-05 11:09:55 +0000 |
---|---|---|
committer | Dwayne Boone <dwayne@zeroc.com> | 2005-07-05 11:09:55 +0000 |
commit | 9b8cc712d4a41d71840416776bc94ee8485bb9b3 (patch) | |
tree | 7d467fdd6a66bc2b5878d82070d45adbd5c20414 /cppe/src/IceE/FactoryTableDef.cpp | |
parent | cleaning the cache method out of ReferenceFactory (diff) | |
download | ice-9b8cc712d4a41d71840416776bc94ee8485bb9b3.tar.bz2 ice-9b8cc712d4a41d71840416776bc94ee8485bb9b3.tar.xz ice-9b8cc712d4a41d71840416776bc94ee8485bb9b3.zip |
Changed Ice to IceE EVERYWHERE!!!
Diffstat (limited to 'cppe/src/IceE/FactoryTableDef.cpp')
-rw-r--r-- | cppe/src/IceE/FactoryTableDef.cpp | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/cppe/src/IceE/FactoryTableDef.cpp b/cppe/src/IceE/FactoryTableDef.cpp new file mode 100644 index 00000000000..ae81f4bd657 --- /dev/null +++ b/cppe/src/IceE/FactoryTableDef.cpp @@ -0,0 +1,144 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2005 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICEE_LICENSE file included in this distribution. +// +// ********************************************************************** + +#include <IceE/FactoryTableDef.h> +#include <IceE/UserExceptionFactory.h> + +#ifdef __APPLE__ +# include <dlfcn.h> +#endif + +namespace IceE +{ + +FactoryTableWrapper factoryTableWrapper; // Single global instance of the wrapper object that + // initializes factoryTable. + +ICEE_API FactoryTableDef* factoryTable; // Single global instance of the factory table for + // non-local exceptions and non-abstract classes +} + +// +// Add a factory to the exception factory table. +// If the factory is present already, increment its reference count. +// +void +IceE::FactoryTableDef::addExceptionFactory(const std::string& t, const IceEInternal::UserExceptionFactoryPtr& f) +{ + IceE::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 +// +IceEInternal::UserExceptionFactoryPtr +IceE::FactoryTableDef::getExceptionFactory(const std::string& t) const +{ + IceE::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 : IceEInternal::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 +IceE::FactoryTableDef::removeExceptionFactory(const std::string& t) +{ + IceE::Mutex::Lock lock(_m); + EFTable::iterator i = _eft.find(t); + if(i != _eft.end()) + { + if(--i->second.second == 0) + { + _eft.erase(i); + } + } +} + +// +// The code generated by slice2cpp contains a file static instance of FactoryTable. +// The constructor of FactoryTable calls initialize(), as does the constructor of +// FactoryTableWrapper. This ensures that the global factoryTable variable is initialized +// before it can be used, regardless of the order of initialization of global objects. +// +IceE::FactoryTableWrapper::FactoryTableWrapper() +{ + initialize(); +} + +IceE::FactoryTableWrapper::~FactoryTableWrapper() +{ + finalize(); +} + +// +// Initialize the single global instance of the factory table, counting +// the number of calls made. +// +void +IceE::FactoryTableWrapper::initialize() +{ + IceE::StaticMutex::Lock lock(_m); + if(_initCount == 0) + { + factoryTable = new FactoryTableDef; + } + ++_initCount; +} + +// +// Delete the table if its reference count drops to zero. +// +void +IceE::FactoryTableWrapper::finalize() +{ + IceE::StaticMutex::Lock lock(_m); + if(--_initCount == 0) + { + delete factoryTable; + } +} + +IceE::StaticMutex IceE::FactoryTableWrapper::_m = ICEE_STATIC_MUTEX_INITIALIZER; +int IceE::FactoryTableWrapper::_initCount = 0; // Initialization count |