summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlevine <levine@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1997-08-26 17:57:11 +0000
committerlevine <levine@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1997-08-26 17:57:11 +0000
commite4d001cb1043a7d4beec0de2eb4dc528f506a711 (patch)
tree967f2b4a09e6abd8554884cf491f27fee2b272ef
parent017f8f4206675b4a8f3978a82f87dcca65e8abc1 (diff)
downloadATCD-e4d001cb1043a7d4beec0de2eb4dc528f506a711.tar.gz
register all ACE_Singletons for cleanup with the ACE_Object_Manager
-rw-r--r--ace/Singleton.cpp48
-rw-r--r--ace/Singleton.h6
2 files changed, 47 insertions, 7 deletions
diff --git a/ace/Singleton.cpp b/ace/Singleton.cpp
index 0c31a191302..01e34a899d2 100644
--- a/ace/Singleton.cpp
+++ b/ace/Singleton.cpp
@@ -7,6 +7,7 @@
#define ACE_BUILD_DLL
#include "ace/Singleton.h"
#include "ace/Synch_T.h"
+#include "ace/Object_Manager.h"
#if !defined (__ACE_INLINE__)
#include "ace/Singleton.i"
@@ -66,7 +67,12 @@ ACE_Singleton<TYPE, LOCK>::instance (void)
ACE_GUARD_RETURN (LOCK, ace_mon, (ACE_Singleton<TYPE, LOCK>::singleton_lock_i ()), 0);
if (singleton == 0)
+ {
ACE_NEW_RETURN (singleton, TYPE, 0);
+
+ // Register for destruction with ACE_Object_Manager.
+ ACE_Object_Manager::at_exit (singleton, cleanup, 0);
+ }
}
return singleton;
@@ -86,6 +92,16 @@ ACE_Singleton<TYPE, LOCK>::instance (TYPE *new_instance)
return old_instance;
}
+template <class TYPE, class LOCK> void
+ACE_Singleton<TYPE, LOCK>::cleanup (void *object, void *)
+{
+ ACE_TRACE ("ACE_Singleton::cleanup");
+
+ delete (TYPE *) object;
+ object = 0;
+}
+ ::atexit (ACE_Static_Object_Lock::atexit);
+
#if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
// Pointer to the Singleton instance.
template <class TYPE, class LOCK> TYPE *
@@ -129,10 +145,12 @@ ACE_TSS_Singleton<TYPE, LOCK>::instance (void)
if (instance_ == 0)
{
- instance_ = new ACE_TSS<TYPE>;
+ ACE_NEW_RETURN (instance_, ACE_TSS<TYPE>, 0);
- if (instance_ == 0)
- return 0;
+#if 0 /* ACE_Object_Manager::at_thread_exit () is not implemented yet. */
+ // Register for destruction with ACE_Object_Manager.
+ ACE_Object_Manager::at_thread_exit (instance_, cleanup, 0);
+#endif /* 0 */
}
}
@@ -146,10 +164,17 @@ ACE_TSS_Singleton<TYPE, LOCK>::instance (void)
if (ACE_TSS_Singleton<TYPE, LOCK>::instance_ == 0)
{
- ACE_TSS_Singleton<TYPE, LOCK>::instance_ = new ACE_TSS<TYPE>;
-
- if (ACE_TSS_Singleton<TYPE, LOCK>::instance_ == 0)
- return 0;
+ ACE_NEW_RETURN (ACE_TSS_Singleton<TYPE, LOCK>::instance_,
+ ACE_TSS<TYPE>,
+ 0);
+
+#if 0 /* ACE_Object_Manager::at_thread_exit () is not implemented yet. */
+ // Register for destruction with ACE_Object_Manager.
+ ACE_Object_Manager::at_thread_exit (
+ ACE_TSS_Singleton<TYPE, LOCK>::instance_,
+ cleanup,
+ 0);
+#endif /* 0 */
}
}
@@ -158,6 +183,15 @@ ACE_TSS_Singleton<TYPE, LOCK>::instance (void)
#endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */
}
+template <class TYPE, class LOCK> void
+ACE_TSS_Singleton<TYPE, LOCK>::cleanup (void *object, void *)
+{
+ ACE_TRACE ("ACE_TSS_Singleton::cleanup");
+
+ delete (TYPE *) object;
+ object = 0;
+}
+
#if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
// Pointer to the Singleton instance.
template <class TYPE, class LOCK> ACE_TSS<TYPE> *
diff --git a/ace/Singleton.h b/ace/Singleton.h
index 0c4a322735d..5c4510d2922 100644
--- a/ace/Singleton.h
+++ b/ace/Singleton.h
@@ -37,6 +37,9 @@ public:
static TYPE *instance (TYPE*);
// Set the Singleton instance.
+ static void cleanup (void *object, void *);
+ // Cleanup method, used by ACE_Object_Manager to destroy the singleton.
+
static void dump (void);
// Dump the state of the object.
@@ -69,6 +72,9 @@ public:
static TYPE *instance (void);
// Global access point to the Singleton.
+ static void cleanup (void *object, void *);
+ // Cleanup method, used by ACE_Object_Manager to destroy the singleton.
+
static void dump (void);
// Dump the state of the object.