summaryrefslogtreecommitdiff
path: root/cppe/src/IceE/FactoryTableDef.cpp
diff options
context:
space:
mode:
authorDwayne Boone <dwayne@zeroc.com>2005-07-05 11:09:55 +0000
committerDwayne Boone <dwayne@zeroc.com>2005-07-05 11:09:55 +0000
commit9b8cc712d4a41d71840416776bc94ee8485bb9b3 (patch)
tree7d467fdd6a66bc2b5878d82070d45adbd5c20414 /cppe/src/IceE/FactoryTableDef.cpp
parentcleaning the cache method out of ReferenceFactory (diff)
downloadice-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.cpp144
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