diff options
Diffstat (limited to 'ace/Singleton.cpp')
-rw-r--r-- | ace/Singleton.cpp | 87 |
1 files changed, 25 insertions, 62 deletions
diff --git a/ace/Singleton.cpp b/ace/Singleton.cpp index cffdfbe0080..559c4b289df 100644 --- a/ace/Singleton.cpp +++ b/ace/Singleton.cpp @@ -96,92 +96,55 @@ template <class TYPE, class LOCK> LOCK ACE_Singleton<TYPE, LOCK>::ace_singleton_lock_; #endif /* !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES) */ -#if 0 -template <class TYPE, class LOCK, ACE_SingletonEx_Strategy MEMORY> void -ACE_SingletonEx<TYPE, LOCK, MEMORY>::dump (void) +template <class TYPE> void +ACE_TSS_Singleton<TYPE>::dump (void) { - ACE_TRACE ("ACE_SingletonEx<TYPE, LOCK, MEMORY>::dump"); + ACE_TRACE ("ACE_TSS_Singleton<TYPE>::dump"); #if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES) - ACE_DEBUG ((LM_DEBUG, "instance_ = %x", - ACE_SingletonEx<TYPE, LOCK, MEMORY>::instance_i ())); - ACE_SingletonEx<TYPE, LOCK, MEMORY>::singleton_lock_i ().dump (); + ACE_DEBUG ((LM_DEBUG, "instance_ = %x", tss_instance_)); ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP)); #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */ } -template <class TYPE, class LOCK, ACE_SingletonEx_Strategy MEMORY> TYPE *& -ACE_SingletonEx<TYPE, LOCK, MEMORY>::instance_i (void) +template <class TYPE> TYPE * +ACE_TSS_Singleton<TYPE>::instance (void) { + ACE_TRACE ("ACE_TSS_Singleton::instance"); + #if defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES) // Pointer to the Singleton instance. This works around a bug with // G++... - static TYPE *instance_ = 0; + static ACE_TSS<TYPE> *instance_ = 0; - return instance_; -#else - return ACE_SingletonEx<TYPE, LOCK, MEMORY>::instance_; -#endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */ -} + if (instance_ == 0) + { + instance_ = new ACE_TSS<TYPE>; -template <class TYPE, class LOCK, ACE_SingletonEx_Strategy MEMORY> LOCK & -ACE_SingletonEx<TYPE, LOCK, MEMORY>::singleton_lock_i (void) -{ -#if defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES) - // Lock the creation of the singleton. This works around a - // "feature" of G++... ;-) - static LOCK ace_singletonex_lock_; + if (instance_ == 0) + return 0; + } - return ace_singletonex_lock_; + return ACE_TSS_GET (instance_, TYPE); #else - return ACE_SingletonEx<TYPE, LOCK, MEMORY>::ace_singletonex_lock_; -#endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */ -} - -template <class TYPE, class LOCK, ACE_SingletonEx_Strategy MEMORY> TYPE * -ACE_SingletonEx<TYPE, LOCK, MEMORY>::instance (void) -{ - ACE_TRACE ("ACE_SingletonEx<TYPE, LOCK, MEMORY>::instance"); - TYPE *&singleton = ACE_SingletonEx<TYPE, LOCK, MEMORY>::instance_i (); - - // Perform the Double-Check pattern... - if (singleton == 0) + if (ACE_TSS_Singleton<TYPE>::tss_instance_ == 0) { - ACE_GUARD_RETURN (LOCK, ace_mon, (ACE_SingletonEx<TYPE, LOCK, MEMORY>::singleton_lock_i ()), 0); + ACE_TSS_Singleton<TYPE>::tss_instance_ = new ACE_TSS<TYPE>; - if (singleton == 0) - ACE_NEW_RETURN (singleton, TYPE, 0); + if (ACE_TSS_Singleton<TYPE>::tss_instance_ == 0) + return 0; } - if (MEMORY == ACE_SINGLETON_HEAP) - return singleton; - else - return singleton->ts_object (); -} - -template <class TYPE, class LOCK, ACE_SingletonEx_Strategy MEMORY> TYPE * -ACE_Singleton<TYPE, LOCK, MEMORY>::instance (TYPE *new_instance) -{ - ACE_TRACE ("ACE_Singleton<TYPE, LOCK, MEMORY>::set_instance"); - - ACE_GUARD_RETURN (LOCK, ace_mon, (ACE_SingletonEx<TYPE, LOCK, MEMORY>::singleton_lock_i ()), 0); + return ACE_TSS_GET (ACE_TSS_Singleton<TYPE>::tss_instance_, TYPE); - TYPE *&singleton = ACE_Singleton<TYPE, LOCK, MEMORY>::instance_i (); - TYPE *old_instance = singleton; - singleton = new_instance; - - return old_instance; +#endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */ } #if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES) // Pointer to the Singleton instance. -template <class TYPE, class LOCK, ACE_SingletonEx_Strategy MEMORY> TYPE * -ACE_SingletonEx<TYPE, LOCK, MEMORY>::instance_ = 0; - -// Lock the creation of the singleton. -template <class TYPE, class LOCK, ACE_SingletonEx_Strategy MEMORY> LOCK -ACE_SingletonEx<TYPE, LOCK, MEMORY>::ace_singletonex_lock_; +template <class TYPE> ACE_TSS<TYPE> * +ACE_TSS_Singleton<TYPE>::tss_instance_ = 0; #endif /* !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES) */ -#endif + #endif /* ACE_SINGLETON_C */ |