// Singleton.cpp // $Id$ #if !defined (ACE_SINGLETON_C) #define ACE_SINGLETON_C #define ACE_BUILD_DLL #include "ace/Singleton.h" #include "ace/Synch_T.h" #if !defined (__ACE_INLINE__) #include "ace/Singleton.i" #endif /* __ACE_INLINE__ */ template void ACE_Singleton::dump (void) { ACE_TRACE ("ACE_Singleton::dump"); #if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES) ACE_DEBUG ((LM_DEBUG, "instance_ = %x", ACE_Singleton::instance_i ())); ACE_Singleton::singleton_lock_i ().dump (); ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP)); #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */ } template TYPE *& ACE_Singleton::instance_i (void) { #if defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES) // Pointer to the Singleton instance. This works around a bug with // G++... static TYPE *instance_ = 0; return instance_; #else return ACE_Singleton::instance_; #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */ } template LOCK & ACE_Singleton::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_singleton_lock_; return ace_singleton_lock_; #else return ACE_Singleton::ace_singleton_lock_; #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */ } template TYPE * ACE_Singleton::instance (void) { ACE_TRACE ("ACE_Singleton::instance"); TYPE *&singleton = ACE_Singleton::instance_i (); // Perform the Double-Check pattern... if (singleton == 0) { ACE_GUARD_RETURN (LOCK, ace_mon, (ACE_Singleton::singleton_lock_i ()), 0); if (singleton == 0) ACE_NEW_RETURN (singleton, TYPE, 0); } return singleton; } template TYPE * ACE_Singleton::instance (TYPE *new_instance) { ACE_TRACE ("ACE_Singleton::set_instance"); ACE_GUARD_RETURN (LOCK, ace_mon, (ACE_Singleton::singleton_lock_i ()), 0); TYPE *&singleton = ACE_Singleton::instance_i (); TYPE *old_instance = singleton; singleton = new_instance; return old_instance; } #if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES) // Pointer to the Singleton instance. template TYPE * ACE_Singleton::instance_ = 0; // Lock the creation of the singleton. template LOCK ACE_Singleton::ace_singleton_lock_; #endif /* !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES) */ template void ACE_TSS_Singleton::dump (void) { ACE_TRACE ("ACE_TSS_Singleton::dump"); #if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES) ACE_DEBUG ((LM_DEBUG, "instance_ = %x", instance_)); ace_singleton_lock_.dump(); ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP)); #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */ } template TYPE * ACE_TSS_Singleton::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 ACE_TSS *instance_ = 0; // Lock the creation of the singleton. This works around a // "feature" of G++... ;-) static LOCK ace_singleton_lock_; // Perform the Double-Check pattern... if (instance_ == 0) { ACE_GUARD_RETURN (LOCK, ace_mon, ace_singleton_lock_, 0); if (instance_ == 0) { instance_ = new ACE_TSS; if (instance_ == 0) return 0; } } return ACE_TSS_GET (instance_, TYPE); #else // Perform the Double-Check pattern... if (ACE_TSS_Singleton::instance_ == 0) { ACE_GUARD_RETURN (LOCK, ace_mon, (ACE_TSS_Singleton::ace_singleton_lock_), 0); if (ACE_TSS_Singleton::instance_ == 0) { ACE_TSS_Singleton::instance_ = new ACE_TSS; if (ACE_TSS_Singleton::instance_ == 0) return 0; } } return ACE_TSS_GET ((ACE_TSS_Singleton::instance_), TYPE); #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */ } #if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES) // Pointer to the Singleton instance. template ACE_TSS * ACE_TSS_Singleton::instance_ = 0; // Lock the creation of the singleton. template LOCK ACE_TSS_Singleton::ace_singleton_lock_; #endif /* !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES) */ #endif /* ACE_SINGLETON_C */