Singleton.cpp

Go to the documentation of this file.
00001 // Singleton.cpp,v 4.54 2005/10/28 16:14:55 ossama Exp
00002 
00003 #ifndef ACE_SINGLETON_CPP
00004 #define ACE_SINGLETON_CPP
00005 
00006 #include "ace/Singleton.h"
00007 
00008 #if !defined (ACE_LACKS_PRAGMA_ONCE)
00009 # pragma once
00010 #endif /* ACE_LACKS_PRAGMA_ONCE */
00011 
00012 #if !defined (__ACE_INLINE__)
00013 #include "ace/Singleton.inl"
00014 #endif /* __ACE_INLINE__ */
00015 
00016 #include "ace/Object_Manager.h"
00017 #include "ace/Log_Msg.h"
00018 #include "ace/Framework_Component.h"
00019 #include "ace/Guard_T.h"
00020 
00021 ACE_RCSID (ace,
00022            Singleton,
00023            "Singleton.cpp,v 4.54 2005/10/28 16:14:55 ossama Exp")
00024 
00025 
00026 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00027 
00028 template <class TYPE, class ACE_LOCK> void
00029 ACE_Singleton<TYPE, ACE_LOCK>::dump (void)
00030 {
00031 #if defined (ACE_HAS_DUMP)
00032   ACE_TRACE ("ACE_Singleton<TYPE, ACE_LOCK>::dump");
00033 
00034 #if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
00035   ACE_DEBUG ((LM_DEBUG,  ACE_LIB_TEXT ("instance_ = %x"),
00036               ACE_Singleton<TYPE, ACE_LOCK>::instance_i ()));
00037   ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
00038 #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */
00039 #endif /* ACE_HAS_DUMP */
00040 }
00041 
00042 template <class TYPE, class ACE_LOCK> ACE_Singleton<TYPE, ACE_LOCK> *&
00043 ACE_Singleton<TYPE, ACE_LOCK>::instance_i (void)
00044 {
00045 #if defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
00046   // Pointer to the Singleton instance.  This works around a bug with
00047   // G++ and it's (mis-)handling of templates and statics...
00048   static ACE_Singleton<TYPE, ACE_LOCK> *singleton_ = 0;
00049 
00050   return singleton_;
00051 #else
00052   return ACE_Singleton<TYPE, ACE_LOCK>::singleton_;
00053 #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */
00054 }
00055 
00056 template <class TYPE, class ACE_LOCK> TYPE *
00057 ACE_Singleton<TYPE, ACE_LOCK>::instance (void)
00058 {
00059   ACE_TRACE ("ACE_Singleton<TYPE, ACE_LOCK>::instance");
00060 
00061   ACE_Singleton<TYPE, ACE_LOCK> *&singleton =
00062     ACE_Singleton<TYPE, ACE_LOCK>::instance_i ();
00063 
00064   // Perform the Double-Check pattern...
00065   if (singleton == 0)
00066     {
00067       if (ACE_Object_Manager::starting_up () ||
00068           ACE_Object_Manager::shutting_down ())
00069         {
00070           // The program is still starting up, and therefore assumed
00071           // to be single threaded.  There's no need to double-check.
00072           // Or, the ACE_Object_Manager instance has been destroyed,
00073           // so the preallocated lock is not available.  Either way,
00074           // don't register for destruction with the
00075           // ACE_Object_Manager:  we'll have to leak this instance.
00076 
00077           ACE_NEW_RETURN (singleton, (ACE_Singleton<TYPE, ACE_LOCK>), 0);
00078         }
00079       else
00080         {
00081 #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
00082           // Obtain a lock from the ACE_Object_Manager.  The pointer
00083           // is static, so we only obtain one per ACE_Singleton
00084           // instantiation.
00085           static ACE_LOCK *lock = 0;
00086           if (ACE_Object_Manager::get_singleton_lock (lock) != 0)
00087             // Failed to acquire the lock!
00088             return 0;
00089 
00090           ACE_GUARD_RETURN (ACE_LOCK, ace_mon, *lock, 0);
00091 
00092           if (singleton == 0)
00093             {
00094 #endif /* ACE_MT_SAFE */
00095               ACE_NEW_RETURN (singleton, (ACE_Singleton<TYPE, ACE_LOCK>), 0);
00096 
00097               // Register for destruction with ACE_Object_Manager.
00098               ACE_Object_Manager::at_exit (singleton);
00099 #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
00100             }
00101 #endif /* ACE_MT_SAFE */
00102         }
00103     }
00104 
00105   return &singleton->instance_;
00106 }
00107 
00108 template <class TYPE, class ACE_LOCK> void
00109 ACE_Singleton<TYPE, ACE_LOCK>::cleanup (void *)
00110 {
00111   delete this;
00112   ACE_Singleton<TYPE, ACE_LOCK>::instance_i () = 0;
00113 }
00114 
00115 #if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
00116 // Pointer to the Singleton instance.
00117 template <class TYPE, class ACE_LOCK> ACE_Singleton<TYPE, ACE_LOCK> *
00118 ACE_Singleton<TYPE, ACE_LOCK>::singleton_ = 0;
00119 
00120 template <class TYPE, class ACE_LOCK> ACE_Unmanaged_Singleton<TYPE, ACE_LOCK> *
00121 ACE_Unmanaged_Singleton<TYPE, ACE_LOCK>::singleton_ = 0;
00122 #endif /* !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES) */
00123 
00124 template <class TYPE, class ACE_LOCK> void
00125 ACE_Unmanaged_Singleton<TYPE, ACE_LOCK>::dump (void)
00126 {
00127 #if defined (ACE_HAS_DUMP)
00128   ACE_TRACE ("ACE_Unmanaged_Singleton<TYPE, ACE_LOCK>::dump");
00129 
00130 #if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
00131   ACE_DEBUG ((LM_DEBUG,  ACE_LIB_TEXT ("instance_ = %x"),
00132               ACE_Unmanaged_Singleton<TYPE, ACE_LOCK>::instance_i ()));
00133   ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
00134 #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */
00135 #endif /* ACE_HAS_DUMP */
00136 }
00137 
00138 template <class TYPE, class ACE_LOCK>
00139 ACE_Unmanaged_Singleton<TYPE, ACE_LOCK> *&
00140 ACE_Unmanaged_Singleton<TYPE, ACE_LOCK>::instance_i (void)
00141 {
00142 #if defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
00143   // Pointer to the Singleton instance.  This works around a bug with
00144   // G++ and it's (mis-)handling of templates and statics...
00145   static ACE_Unmanaged_Singleton<TYPE, ACE_LOCK> *singleton_ = 0;
00146 
00147   return singleton_;
00148 #else
00149   return ACE_Unmanaged_Singleton<TYPE, ACE_LOCK>::singleton_;
00150 #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */
00151 }
00152 
00153 template <class TYPE, class ACE_LOCK> TYPE *
00154 ACE_Unmanaged_Singleton<TYPE, ACE_LOCK>::instance (void)
00155 {
00156   ACE_TRACE ("ACE_Unmanaged_Singleton<TYPE, ACE_LOCK>::instance");
00157 
00158   ACE_Unmanaged_Singleton<TYPE, ACE_LOCK> *&singleton =
00159     ACE_Unmanaged_Singleton<TYPE, ACE_LOCK>::instance_i ();
00160 
00161   // Perform the Double-Check pattern...
00162   if (singleton == 0)
00163     {
00164       if (ACE_Object_Manager::starting_up () ||
00165           ACE_Object_Manager::shutting_down ())
00166         {
00167           // The program is still starting up, and therefore assumed
00168           // to be single threaded.  There's no need to double-check.
00169           // Or, the ACE_Object_Manager instance has been destroyed,
00170           // so the preallocated lock is not available.  Either way,
00171           // don't register for destruction with the
00172           // ACE_Object_Manager:  we'll have to leak this instance.
00173 
00174           ACE_NEW_RETURN (singleton, (ACE_Unmanaged_Singleton<TYPE, ACE_LOCK>),
00175                           0);
00176         }
00177       else
00178         {
00179 #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
00180           // Obtain a lock from the ACE_Object_Manager.  The pointer
00181           // is static, so we only obtain one per
00182           // ACE_Unmanaged_Singleton instantiation.
00183           static ACE_LOCK *lock = 0;
00184           if (ACE_Object_Manager::get_singleton_lock (lock) != 0)
00185             // Failed to acquire the lock!
00186             return 0;
00187 
00188           ACE_GUARD_RETURN (ACE_LOCK, ace_mon, *lock, 0);
00189 #endif /* ACE_MT_SAFE */
00190 
00191           if (singleton == 0)
00192             ACE_NEW_RETURN (singleton,
00193                             (ACE_Unmanaged_Singleton<TYPE, ACE_LOCK>),
00194                             0);
00195         }
00196     }
00197 
00198   return &singleton->instance_;
00199 }
00200 
00201 template <class TYPE, class ACE_LOCK> void
00202 ACE_Unmanaged_Singleton<TYPE, ACE_LOCK>::close (void)
00203 {
00204   ACE_Unmanaged_Singleton<TYPE, ACE_LOCK> *&singleton =
00205     ACE_Unmanaged_Singleton<TYPE, ACE_LOCK>::instance_i ();
00206 
00207   if (singleton)
00208     {
00209       singleton->cleanup ();
00210       ACE_Unmanaged_Singleton<TYPE, ACE_LOCK>::instance_i () = 0;
00211     }
00212 }
00213 
00214 template <class TYPE, class ACE_LOCK> void
00215 ACE_TSS_Singleton<TYPE, ACE_LOCK>::dump (void)
00216 {
00217 #if defined (ACE_HAS_DUMP)
00218   ACE_TRACE ("ACE_TSS_Singleton<TYPE, ACE_LOCK>::dump");
00219 
00220 #if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
00221   ACE_DEBUG ((LM_DEBUG,  ACE_LIB_TEXT ("instance_ = %x"),
00222               ACE_TSS_Singleton<TYPE, ACE_LOCK>::instance_i ()));
00223   ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
00224 #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */
00225 #endif /* ACE_HAS_DUMP */
00226 }
00227 
00228 template <class TYPE, class ACE_LOCK> ACE_TSS_Singleton<TYPE, ACE_LOCK> *&
00229 ACE_TSS_Singleton<TYPE, ACE_LOCK>::instance_i (void)
00230 {
00231 #if defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
00232   // Pointer to the Singleton instance.  This works around a bug with
00233   // G++ and it's (mis-)handling of templates and statics...
00234   static ACE_TSS_Singleton<TYPE, ACE_LOCK> *singleton_ = 0;
00235 
00236   return singleton_;
00237 #else
00238   return ACE_TSS_Singleton<TYPE, ACE_LOCK>::singleton_;
00239 #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */
00240 }
00241 
00242 template <class TYPE, class ACE_LOCK> TYPE *
00243 ACE_TSS_Singleton<TYPE, ACE_LOCK>::instance (void)
00244 {
00245   ACE_TRACE ("ACE_TSS_Singleton<TYPE, ACE_LOCK>::instance");
00246 
00247   ACE_TSS_Singleton<TYPE, ACE_LOCK> *&singleton =
00248     ACE_TSS_Singleton<TYPE, ACE_LOCK>::instance_i ();
00249 
00250   // Perform the Double-Check pattern...
00251   if (singleton == 0)
00252     {
00253       if (ACE_Object_Manager::starting_up () ||
00254           ACE_Object_Manager::shutting_down ())
00255         {
00256           // The program is still starting up, and therefore assumed
00257           // to be single threaded.  There's no need to double-check.
00258           // Or, the ACE_Object_Manager instance has been destroyed,
00259           // so the preallocated lock is not available.  Either way,
00260           // don't register for destruction with the
00261           // ACE_Object_Manager:  we'll have to leak this instance.
00262 
00263           ACE_NEW_RETURN (singleton, (ACE_TSS_Singleton<TYPE, ACE_LOCK>), 0);
00264         }
00265       else
00266         {
00267 #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
00268 
00269           // Obtain a lock from the ACE_Object_Manager.  The pointer
00270           // is static, so we only obtain one per ACE_Singleton instantiation.
00271           static ACE_LOCK *lock = 0;
00272           if (ACE_Object_Manager::get_singleton_lock (lock) != 0)
00273             // Failed to acquire the lock!
00274             return 0;
00275 
00276           ACE_GUARD_RETURN (ACE_LOCK, ace_mon, *lock, 0);
00277 
00278           if (singleton == 0)
00279             {
00280 #endif /* ACE_MT_SAFE */
00281               ACE_NEW_RETURN (singleton, (ACE_TSS_Singleton<TYPE, ACE_LOCK>),
00282                               0);
00283 
00284               // Register for destruction with ACE_Object_Manager.
00285               ACE_Object_Manager::at_exit (singleton);
00286 #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
00287             }
00288 #endif /* ACE_MT_SAFE */
00289         }
00290     }
00291 
00292   return ACE_TSS_GET (&singleton->instance_, TYPE);
00293 }
00294 
00295 template <class TYPE, class ACE_LOCK> void
00296 ACE_TSS_Singleton<TYPE, ACE_LOCK>::cleanup (void *)
00297 {
00298   delete this;
00299   ACE_TSS_Singleton<TYPE, ACE_LOCK>::instance_i () = 0;
00300 }
00301 
00302 template <class TYPE, class ACE_LOCK> void
00303 ACE_Unmanaged_TSS_Singleton<TYPE, ACE_LOCK>::dump (void)
00304 {
00305 #if defined (ACE_HAS_DUMP)
00306   ACE_TRACE ("ACE_Unmanaged_TSS_Singleton<TYPE, ACE_LOCK>::dump");
00307 
00308 #if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
00309   ACE_DEBUG ((LM_DEBUG,  ACE_LIB_TEXT ("instance_ = %x"),
00310               ACE_Unmanaged_TSS_Singleton<TYPE, ACE_LOCK>::instance_i ()));
00311   ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
00312 #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */
00313 #endif /* ACE_HAS_DUMP */
00314 }
00315 
00316 template <class TYPE, class ACE_LOCK>
00317 ACE_Unmanaged_TSS_Singleton<TYPE, ACE_LOCK> *&
00318 ACE_Unmanaged_TSS_Singleton<TYPE, ACE_LOCK>::instance_i (void)
00319 {
00320 #if defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
00321   // Pointer to the Singleton instance.  This works around a bug with
00322   // G++ and it's (mis-)handling of templates and statics...
00323   static ACE_Unmanaged_TSS_Singleton<TYPE, ACE_LOCK> *singleton_ = 0;
00324 
00325   return singleton_;
00326 #else
00327   return ACE_Unmanaged_TSS_Singleton<TYPE, ACE_LOCK>::singleton_;
00328 #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */
00329 }
00330 
00331 template <class TYPE, class ACE_LOCK> TYPE *
00332 ACE_Unmanaged_TSS_Singleton<TYPE, ACE_LOCK>::instance (void)
00333 {
00334   ACE_TRACE ("ACE_Unmanaged_TSS_Singleton<TYPE, ACE_LOCK>::instance");
00335 
00336   ACE_Unmanaged_TSS_Singleton<TYPE, ACE_LOCK> *&singleton =
00337     ACE_Unmanaged_TSS_Singleton<TYPE, ACE_LOCK>::instance_i ();
00338 
00339   // Perform the Double-Check pattern...
00340   if (singleton == 0)
00341     {
00342       if (ACE_Object_Manager::starting_up () ||
00343           ACE_Object_Manager::shutting_down ())
00344         {
00345           // The program is still starting up, and therefore assumed
00346           // to be single threaded.  There's no need to double-check.
00347           // Or, the ACE_Object_Manager instance has been destroyed,
00348           // so the preallocated lock is not available.  Either way,
00349           // don't register for destruction with the
00350           // ACE_Object_Manager:  we'll have to leak this instance.
00351 
00352           ACE_NEW_RETURN (singleton,
00353                           (ACE_Unmanaged_TSS_Singleton<TYPE, ACE_LOCK>),
00354                           0);
00355         }
00356       else
00357         {
00358 #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
00359           // Obtain a lock from the ACE_Object_Manager.  The pointer
00360           // is static, so we only obtain one per
00361           // ACE_Unmanaged_Singleton instantiation.
00362           static ACE_LOCK *lock = 0;
00363           if (ACE_Object_Manager::get_singleton_lock (lock) != 0)
00364             // Failed to acquire the lock!
00365             return 0;
00366 
00367           ACE_GUARD_RETURN (ACE_LOCK, ace_mon, *lock, 0);
00368 #endif /* ACE_MT_SAFE */
00369 
00370           if (singleton == 0)
00371             ACE_NEW_RETURN (singleton,
00372                             (ACE_Unmanaged_TSS_Singleton<TYPE, ACE_LOCK>),
00373                             0);
00374         }
00375     }
00376 
00377   return ACE_TSS_GET (&singleton->instance_, TYPE);
00378 }
00379 
00380 template <class TYPE, class ACE_LOCK> void
00381 ACE_Unmanaged_TSS_Singleton<TYPE, ACE_LOCK>::close (void)
00382 {
00383   ACE_Unmanaged_TSS_Singleton<TYPE, ACE_LOCK> *&singleton =
00384     ACE_Unmanaged_TSS_Singleton<TYPE, ACE_LOCK>::instance_i ();
00385 
00386   if (singleton)
00387     singleton->cleanup ();
00388 }
00389 
00390 #if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
00391 // Pointer to the Singleton instance.
00392 template <class TYPE, class ACE_LOCK> ACE_TSS_Singleton <TYPE, ACE_LOCK> *
00393 ACE_TSS_Singleton<TYPE, ACE_LOCK>::singleton_ = 0;
00394 
00395 template <class TYPE, class ACE_LOCK>
00396 ACE_Unmanaged_TSS_Singleton<TYPE, ACE_LOCK> *
00397 ACE_Unmanaged_TSS_Singleton<TYPE, ACE_LOCK>::singleton_ = 0;
00398 #endif /* !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES) */
00399 
00400 /*************************************************************************/
00401 
00402 #if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
00403 // Pointer to the Singleton instance.
00404 template <class TYPE, class ACE_LOCK> ACE_DLL_Singleton_T<TYPE, ACE_LOCK> *
00405 ACE_DLL_Singleton_T<TYPE, ACE_LOCK>::singleton_ = 0;
00406 #endif /* !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES) */
00407 
00408 template <class TYPE, class ACE_LOCK> void
00409 ACE_DLL_Singleton_T<TYPE, ACE_LOCK>::dump (void)
00410 {
00411 #if defined (ACE_HAS_DUMP)
00412   ACE_TRACE ("ACE_DLL_Singleton_T<TYPE, ACE_LOCK>::dump");
00413 
00414 #if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
00415   ACE_DEBUG ((LM_DEBUG,  ACE_LIB_TEXT ("instance_ = %x"),
00416               ACE_DLL_Singleton_T<TYPE, ACE_LOCK>::instance_i ()));
00417   ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
00418 #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */
00419 #endif /* ACE_HAS_DUMP */
00420 }
00421 
00422 template <class TYPE, class ACE_LOCK>
00423 ACE_DLL_Singleton_T<TYPE, ACE_LOCK> *&
00424 ACE_DLL_Singleton_T<TYPE, ACE_LOCK>::instance_i (void)
00425 {
00426   ACE_TRACE ("ACE_DLL_Singleton_T<TYPE, ACE_LOCK>::instance_i");
00427 
00428 #if defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
00429   // Pointer to the Singleton instance.  This works around a bug with
00430   // G++ and it's (mis-)handling of templates and statics...
00431   static ACE_DLL_Singleton_T<TYPE, ACE_LOCK> *singleton_ = 0;
00432 
00433   return singleton_;
00434 #else
00435   return ACE_DLL_Singleton_T<TYPE, ACE_LOCK>::singleton_;
00436 #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */
00437 }
00438 
00439 template <class TYPE, class ACE_LOCK> TYPE *
00440 ACE_DLL_Singleton_T<TYPE, ACE_LOCK>::instance (void)
00441 {
00442   ACE_TRACE ("ACE_DLL_Singleton_T<TYPE, ACE_LOCK>::instance");
00443 
00444   ACE_DLL_Singleton_T<TYPE, ACE_LOCK> *&singleton =
00445     ACE_DLL_Singleton_T<TYPE, ACE_LOCK>::instance_i ();
00446 
00447   // Perform the Double-Check pattern...
00448   if (singleton == 0)
00449     {
00450       if (ACE_Object_Manager::starting_up () ||
00451           ACE_Object_Manager::shutting_down ())
00452         {
00453           // The program is still starting up, and therefore assumed
00454           // to be single threaded.  There's no need to double-check.
00455           // Or, the ACE_Object_Manager instance has been destroyed,
00456           // so the preallocated lock is not available.  Either way,
00457           // don't register for destruction with the
00458           // ACE_Object_Manager:  we'll have to leak this instance.
00459 
00460           ACE_NEW_RETURN (singleton, (ACE_DLL_Singleton_T<TYPE, ACE_LOCK>),
00461                           0);
00462         }
00463       else
00464         {
00465 #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
00466           // Obtain a lock from the ACE_Object_Manager.  The pointer
00467           // is static, so we only obtain one per
00468           // ACE_Unmanaged_Singleton instantiation.
00469           static ACE_LOCK *lock = 0;
00470           if (ACE_Object_Manager::get_singleton_lock (lock) != 0)
00471             // Failed to acquire the lock!
00472             return 0;
00473 
00474           ACE_GUARD_RETURN (ACE_LOCK, ace_mon, *lock, 0);
00475 #endif /* ACE_MT_SAFE */
00476 
00477           if (singleton == 0)
00478             ACE_NEW_RETURN (singleton,
00479                             (ACE_DLL_Singleton_T<TYPE, ACE_LOCK>),
00480                             0);
00481         }
00482       //ACE_REGISTER_FRAMEWORK_COMPONENT(ACE_DLL_Singleton<TYPE,ACE_LOCK>, singleton);
00483       ACE_Framework_Repository::instance ()->register_component
00484         (new ACE_Framework_Component_T<ACE_DLL_Singleton_T<TYPE, ACE_LOCK> > (singleton));
00485     }
00486 
00487   return &singleton->instance_;
00488 }
00489 
00490 template <class TYPE, class ACE_LOCK> void
00491 ACE_DLL_Singleton_T<TYPE, ACE_LOCK>::close (void)
00492 {
00493   ACE_TRACE ("ACE_DLL_Singleton_T<TYPE, ACE_LOCK>::close");
00494 
00495   ACE_DLL_Singleton_T<TYPE, ACE_LOCK> *&singleton =
00496     ACE_DLL_Singleton_T<TYPE, ACE_LOCK>::instance_i ();
00497 
00498   delete singleton;
00499   singleton = 0;
00500 }
00501 
00502 template <class TYPE, class ACE_LOCK> void
00503 ACE_DLL_Singleton_T<TYPE, ACE_LOCK>::close_singleton (void)
00504 {
00505   ACE_TRACE ("ACE_DLL_Singleton_T<TYPE, ACE_LOCK>::close_singleton");
00506   ACE_DLL_Singleton_T<TYPE, ACE_LOCK>::close ();
00507 }
00508 
00509 template <class TYPE, class ACE_LOCK> const ACE_TCHAR *
00510 ACE_DLL_Singleton_T<TYPE, ACE_LOCK>::dll_name (void)
00511 {
00512   return this->instance ()->dll_name ();
00513 }
00514 
00515 template <class TYPE, class ACE_LOCK> const ACE_TCHAR *
00516 ACE_DLL_Singleton_T<TYPE, ACE_LOCK>::name (void)
00517 {
00518   return this->instance ()->name ();
00519 }
00520 
00521 
00522 /**********************************************************************/
00523 
00524 template <class TYPE> const ACE_TCHAR*
00525 ACE_DLL_Singleton_Adapter_T<TYPE>::dll_name (void)
00526 {
00527   // @todo make this a constant somewhere (or it there already is one
00528   // then use it.
00529   return ACE_TEXT("ACE");
00530 }
00531 
00532 ACE_END_VERSIONED_NAMESPACE_DECL
00533 
00534 #endif /* ACE_SINGLETON_CPP */

Generated on Thu Nov 9 09:42:03 2006 for ACE by doxygen 1.3.6