summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/FactoryTable.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/Ice/FactoryTable.cpp')
-rw-r--r--cpp/src/Ice/FactoryTable.cpp50
1 files changed, 40 insertions, 10 deletions
diff --git a/cpp/src/Ice/FactoryTable.cpp b/cpp/src/Ice/FactoryTable.cpp
index 99ae9145596..75420dc4024 100644
--- a/cpp/src/Ice/FactoryTable.cpp
+++ b/cpp/src/Ice/FactoryTable.cpp
@@ -10,24 +10,54 @@
#include <Ice/FactoryTable.h>
#include <Ice/UserExceptionFactory.h>
+namespace IceInternal
+{
+
//
-// This constructor initializes the single global IceInternal::factoryTable instance
-// from the outside (if it hasn't been initialized yet). The constructor here
-// is triggered by a file-static instance of FactoryTable in each
-// slice2cpp-generated header file that uses non-local exceptions or non-abstract classes.
-// This ensures that IceInternal::factoryTable is always initialized before it is used.
+// Single global instance of the factory table for non-local
+// exceptions and non-abstract classes.
//
-IceInternal::FactoryTable::FactoryTable()
+ICE_DECLSPEC_EXPORT FactoryTableDef* factoryTable;
+
+}
+
+namespace
{
- IceInternal::factoryTableWrapper.initialize();
+static int initCount = 0; // Initialization count
+IceUtil::StaticMutex initCountMutex = ICE_STATIC_MUTEX_INITIALIZER;
+
+
+}
+
+//
+// This constructor initializes the single global
+// IceInternal::factoryTable instance from the outside (if it hasn't
+// been initialized yet). The constructor here is triggered by a
+// file-static instance of FactoryTable in each slice2cpp-generated
+// header file that uses non-local exceptions or non-abstract classes.
+// This ensures that IceInternal::factoryTable is always initialized
+// before it is used.
+//
+IceInternal::FactoryTable::FactoryTable()
+{
+ IceUtil::StaticMutex::Lock lock(initCountMutex);
+ if(0 == initCount++)
+ {
+ factoryTable = new FactoryTableDef;
+ }
}
//
-// Similarly, the destructor calls the finalize() method on the factory table wrapper which,
-// once the tables reference count drops to zero, deletes the table.
+// Similarly, the destructor calls the finalize() method on the
+// factory table wrapper which, once the tables reference count drops
+// to zero, deletes the table.
//
IceInternal::FactoryTable::~FactoryTable()
{
- IceInternal::factoryTableWrapper.finalize();
+ IceUtil::StaticMutex::Lock lock(initCountMutex);
+ if(0 == --initCount)
+ {
+ delete factoryTable;
+ }
}