diff options
author | levine <levine@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1997-08-26 17:57:11 +0000 |
---|---|---|
committer | levine <levine@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1997-08-26 17:57:11 +0000 |
commit | e4d001cb1043a7d4beec0de2eb4dc528f506a711 (patch) | |
tree | 967f2b4a09e6abd8554884cf491f27fee2b272ef | |
parent | 017f8f4206675b4a8f3978a82f87dcca65e8abc1 (diff) | |
download | ATCD-e4d001cb1043a7d4beec0de2eb4dc528f506a711.tar.gz |
register all ACE_Singletons for cleanup with the ACE_Object_Manager
-rw-r--r-- | ace/Singleton.cpp | 48 | ||||
-rw-r--r-- | ace/Singleton.h | 6 |
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. |