1 #ifndef ACE_SINGLETON_CPP
2 #define ACE_SINGLETON_CPP
4 #include "ace/Singleton.h"
6 #if !defined (ACE_LACKS_PRAGMA_ONCE)
8 #endif /* ACE_LACKS_PRAGMA_ONCE */
10 #if !defined (__ACE_INLINE__)
11 #include "ace/Singleton.inl"
12 #endif /* __ACE_INLINE__ */
14 #include "ace/Object_Manager.h"
15 #include "ace/Log_Category.h"
16 #include "ace/Framework_Component.h"
17 #include "ace/Guard_T.h"
18 #include "ace/os_include/os_typeinfo.h"
20 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
22 ACE_ALLOC_HOOK_DEFINE_Tcc(ACE_Singleton
)
23 ACE_ALLOC_HOOK_DEFINE_Tcc(ACE_Unmanaged_Singleton
)
24 ACE_ALLOC_HOOK_DEFINE_Tcc(ACE_TSS_Singleton
)
25 ACE_ALLOC_HOOK_DEFINE_Tcc(ACE_Unmanaged_TSS_Singleton
)
26 ACE_ALLOC_HOOK_DEFINE_Tcc(ACE_DLL_Singleton_T
)
27 ACE_ALLOC_HOOK_DEFINE_Tc(ACE_DLL_Singleton_Adapter_T
)
29 template <class TYPE
, class ACE_LOCK
> void
30 ACE_Singleton
<TYPE
, ACE_LOCK
>::dump (void)
32 #if defined (ACE_HAS_DUMP)
33 ACE_TRACE ("ACE_Singleton<TYPE, ACE_LOCK>::dump");
35 #if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
36 ACELIB_DEBUG ((LM_DEBUG
, ACE_TEXT ("instance_ = %x"),
37 ACE_Singleton
<TYPE
, ACE_LOCK
>::instance_i ()));
38 ACELIB_DEBUG ((LM_DEBUG
, ACE_END_DUMP
));
39 #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */
40 #endif /* ACE_HAS_DUMP */
43 template <class TYPE
, class ACE_LOCK
> ACE_Singleton
<TYPE
, ACE_LOCK
> *&
44 ACE_Singleton
<TYPE
, ACE_LOCK
>::instance_i (void)
46 #if defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
47 // Pointer to the Singleton instance. This works around a bug with
48 // G++ and it's (mis-)handling of templates and statics...
49 static ACE_Singleton
<TYPE
, ACE_LOCK
> *singleton_
= 0;
53 return ACE_Singleton
<TYPE
, ACE_LOCK
>::singleton_
;
54 #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */
57 template <class TYPE
, class ACE_LOCK
> TYPE
*
58 ACE_Singleton
<TYPE
, ACE_LOCK
>::instance (void)
60 ACE_TRACE ("ACE_Singleton<TYPE, ACE_LOCK>::instance");
62 ACE_Singleton
<TYPE
, ACE_LOCK
> *&singleton
=
63 ACE_Singleton
<TYPE
, ACE_LOCK
>::instance_i ();
65 // Perform the Double-Check pattern...
68 if (ACE_Object_Manager::starting_up () ||
69 ACE_Object_Manager::shutting_down ())
71 // The program is still starting up, and therefore assumed
72 // to be single threaded. There's no need to double-check.
73 // Or, the ACE_Object_Manager instance has been destroyed,
74 // so the preallocated lock is not available. Either way,
75 // don't register for destruction with the
76 // ACE_Object_Manager: we'll have to leak this instance.
78 ACE_NEW_RETURN (singleton
, (ACE_Singleton
<TYPE
, ACE_LOCK
>), 0);
82 #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
83 // Obtain a lock from the ACE_Object_Manager. The pointer
84 // is static, so we only obtain one per ACE_Singleton
86 #if defined(ACE_FACE_SAFETY_BASE)
87 static ACE_LOCK the_lock
;
88 static ACE_LOCK
*lock
= &the_lock
;
89 #else /* ACE_FACE_SAFETY_BASE */
90 static ACE_LOCK
*lock
= 0;
91 #endif /* ACE_FACE_SAFETY_BASE */
92 if (ACE_Object_Manager::get_singleton_lock (lock
) != 0)
93 // Failed to acquire the lock!
96 ACE_GUARD_RETURN (ACE_LOCK
, ace_mon
, *lock
, 0);
100 #endif /* ACE_MT_SAFE */
101 ACE_NEW_RETURN (singleton
, (ACE_Singleton
<TYPE
, ACE_LOCK
>), 0);
103 // Register for destruction with ACE_Object_Manager.
104 #if !defined (ACE_MT_SAFE) || (ACE_MT_SAFE == 0)
105 ACE_Object_Manager::at_exit (singleton
, 0, typeid (TYPE
).name ());
107 ACE_Object_Manager::at_exit (singleton
, &lock
,
108 typeid (TYPE
).name ());
110 #endif /* ACE_MT_SAFE */
114 return &singleton
->instance_
;
117 template <class TYPE
, class ACE_LOCK
> void
118 ACE_Singleton
<TYPE
, ACE_LOCK
>::cleanup (void *param
)
120 ACE_Object_Manager::remove_at_exit (this);
122 ACE_Singleton
<TYPE
, ACE_LOCK
>::instance_i () = 0;
124 #if !defined ACE_MT_SAFE || ACE_MT_SAFE == 0 || defined ACE_FACE_SAFETY_BASE
125 ACE_UNUSED_ARG (param
);
129 ACE_LOCK
**lock
= static_cast<ACE_LOCK
**> (param
);
135 template <class TYPE
, class ACE_LOCK
> void
136 ACE_Singleton
<TYPE
, ACE_LOCK
>::close (void)
138 ACE_Singleton
<TYPE
, ACE_LOCK
> *&singleton
=
139 ACE_Singleton
<TYPE
, ACE_LOCK
>::instance_i ();
143 singleton
->cleanup ();
144 ACE_Singleton
<TYPE
, ACE_LOCK
>::instance_i () = 0;
148 #if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
149 // Pointer to the Singleton instance.
150 template <class TYPE
, class ACE_LOCK
> ACE_Singleton
<TYPE
, ACE_LOCK
> *
151 ACE_Singleton
<TYPE
, ACE_LOCK
>::singleton_
= 0;
153 template <class TYPE
, class ACE_LOCK
> ACE_Unmanaged_Singleton
<TYPE
, ACE_LOCK
> *
154 ACE_Unmanaged_Singleton
<TYPE
, ACE_LOCK
>::singleton_
= 0;
155 #endif /* !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES) */
157 template <class TYPE
, class ACE_LOCK
> void
158 ACE_Unmanaged_Singleton
<TYPE
, ACE_LOCK
>::dump (void)
160 #if defined (ACE_HAS_DUMP)
161 ACE_TRACE ("ACE_Unmanaged_Singleton<TYPE, ACE_LOCK>::dump");
163 #if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
164 ACELIB_DEBUG ((LM_DEBUG
, ACE_TEXT ("instance_ = %x"),
165 ACE_Unmanaged_Singleton
<TYPE
, ACE_LOCK
>::instance_i ()));
166 ACELIB_DEBUG ((LM_DEBUG
, ACE_END_DUMP
));
167 #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */
168 #endif /* ACE_HAS_DUMP */
171 template <class TYPE
, class ACE_LOCK
>
172 ACE_Unmanaged_Singleton
<TYPE
, ACE_LOCK
> *&
173 ACE_Unmanaged_Singleton
<TYPE
, ACE_LOCK
>::instance_i (void)
175 #if defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
176 // Pointer to the Singleton instance. This works around a bug with
177 // G++ and it's (mis-)handling of templates and statics...
178 static ACE_Unmanaged_Singleton
<TYPE
, ACE_LOCK
> *singleton_
= 0;
182 return ACE_Unmanaged_Singleton
<TYPE
, ACE_LOCK
>::singleton_
;
183 #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */
186 template <class TYPE
, class ACE_LOCK
> TYPE
*
187 ACE_Unmanaged_Singleton
<TYPE
, ACE_LOCK
>::instance (void)
189 ACE_TRACE ("ACE_Unmanaged_Singleton<TYPE, ACE_LOCK>::instance");
191 ACE_Unmanaged_Singleton
<TYPE
, ACE_LOCK
> *&singleton
=
192 ACE_Unmanaged_Singleton
<TYPE
, ACE_LOCK
>::instance_i ();
194 // Perform the Double-Check pattern...
197 if (ACE_Object_Manager::starting_up () ||
198 ACE_Object_Manager::shutting_down ())
200 // The program is still starting up, and therefore assumed
201 // to be single threaded. There's no need to double-check.
202 // Or, the ACE_Object_Manager instance has been destroyed,
203 // so the preallocated lock is not available. Either way,
204 // don't register for destruction with the
205 // ACE_Object_Manager: we'll have to leak this instance.
207 ACE_NEW_RETURN (singleton
, (ACE_Unmanaged_Singleton
<TYPE
, ACE_LOCK
>),
212 #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
213 // Obtain a lock from the ACE_Object_Manager. The pointer
214 // is static, so we only obtain one per
215 // ACE_Unmanaged_Singleton instantiation.
216 #if defined(ACE_FACE_SAFETY_BASE)
217 static ACE_LOCK the_lock
;
218 static ACE_LOCK
*lock
= &the_lock
;
219 #else /* ACE_FACE_SAFETY_BASE */
220 static ACE_LOCK
*lock
= 0;
221 #endif /* ACE_FACE_SAFETY_BASE */
222 if (ACE_Object_Manager::get_singleton_lock (lock
) != 0)
223 // Failed to acquire the lock!
226 ACE_GUARD_RETURN (ACE_LOCK
, ace_mon
, *lock
, 0);
227 #endif /* ACE_MT_SAFE */
230 ACE_NEW_RETURN (singleton
,
231 (ACE_Unmanaged_Singleton
<TYPE
, ACE_LOCK
>),
236 return &singleton
->instance_
;
239 template <class TYPE
, class ACE_LOCK
> void
240 ACE_Unmanaged_Singleton
<TYPE
, ACE_LOCK
>::close (void)
242 ACE_Unmanaged_Singleton
<TYPE
, ACE_LOCK
> *&singleton
=
243 ACE_Unmanaged_Singleton
<TYPE
, ACE_LOCK
>::instance_i ();
247 singleton
->cleanup ();
248 ACE_Unmanaged_Singleton
<TYPE
, ACE_LOCK
>::instance_i () = 0;
252 template <class TYPE
, class ACE_LOCK
> void
253 ACE_TSS_Singleton
<TYPE
, ACE_LOCK
>::dump (void)
255 #if defined (ACE_HAS_DUMP)
256 ACE_TRACE ("ACE_TSS_Singleton<TYPE, ACE_LOCK>::dump");
258 #if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
259 ACELIB_DEBUG ((LM_DEBUG
, ACE_TEXT ("instance_ = %x"),
260 ACE_TSS_Singleton
<TYPE
, ACE_LOCK
>::instance_i ()));
261 ACELIB_DEBUG ((LM_DEBUG
, ACE_END_DUMP
));
262 #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */
263 #endif /* ACE_HAS_DUMP */
266 template <class TYPE
, class ACE_LOCK
> ACE_TSS_Singleton
<TYPE
, ACE_LOCK
> *&
267 ACE_TSS_Singleton
<TYPE
, ACE_LOCK
>::instance_i (void)
269 #if defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
270 // Pointer to the Singleton instance. This works around a bug with
271 // G++ and it's (mis-)handling of templates and statics...
272 static ACE_TSS_Singleton
<TYPE
, ACE_LOCK
> *singleton_
= 0;
276 return ACE_TSS_Singleton
<TYPE
, ACE_LOCK
>::singleton_
;
277 #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */
280 template <class TYPE
, class ACE_LOCK
> TYPE
*
281 ACE_TSS_Singleton
<TYPE
, ACE_LOCK
>::instance (void)
283 ACE_TRACE ("ACE_TSS_Singleton<TYPE, ACE_LOCK>::instance");
285 ACE_TSS_Singleton
<TYPE
, ACE_LOCK
> *&singleton
=
286 ACE_TSS_Singleton
<TYPE
, ACE_LOCK
>::instance_i ();
288 // Perform the Double-Check pattern...
291 if (ACE_Object_Manager::starting_up () ||
292 ACE_Object_Manager::shutting_down ())
294 // The program is still starting up, and therefore assumed
295 // to be single threaded. There's no need to double-check.
296 // Or, the ACE_Object_Manager instance has been destroyed,
297 // so the preallocated lock is not available. Either way,
298 // don't register for destruction with the
299 // ACE_Object_Manager: we'll have to leak this instance.
301 ACE_NEW_RETURN (singleton
, (ACE_TSS_Singleton
<TYPE
, ACE_LOCK
>), 0);
305 #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
307 // Obtain a lock from the ACE_Object_Manager. The pointer
308 // is static, so we only obtain one per ACE_Singleton instantiation.
309 #if defined(ACE_FACE_SAFETY_BASE)
310 static ACE_LOCK the_lock
;
311 static ACE_LOCK
*lock
= &the_lock
;
312 #else /* ACE_FACE_SAFETY_BASE */
313 static ACE_LOCK
*lock
= 0;
314 #endif /* ACE_FACE_SAFETY_BASE */
315 if (ACE_Object_Manager::get_singleton_lock (lock
) != 0)
316 // Failed to acquire the lock!
319 ACE_GUARD_RETURN (ACE_LOCK
, ace_mon
, *lock
, 0);
323 #endif /* ACE_MT_SAFE */
324 ACE_NEW_RETURN (singleton
, (ACE_TSS_Singleton
<TYPE
, ACE_LOCK
>),
327 // Register for destruction with ACE_Object_Manager.
328 ACE_Object_Manager::at_exit (singleton
, 0, typeid (TYPE
).name ());
329 #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
331 #endif /* ACE_MT_SAFE */
335 return ACE_TSS_GET (&singleton
->instance_
, TYPE
);
338 template <class TYPE
, class ACE_LOCK
> void
339 ACE_TSS_Singleton
<TYPE
, ACE_LOCK
>::cleanup (void *)
342 ACE_TSS_Singleton
<TYPE
, ACE_LOCK
>::instance_i () = 0;
345 template <class TYPE
, class ACE_LOCK
> void
346 ACE_Unmanaged_TSS_Singleton
<TYPE
, ACE_LOCK
>::dump (void)
348 #if defined (ACE_HAS_DUMP)
349 ACE_TRACE ("ACE_Unmanaged_TSS_Singleton<TYPE, ACE_LOCK>::dump");
351 #if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
352 ACELIB_DEBUG ((LM_DEBUG
, ACE_TEXT ("instance_ = %x"),
353 ACE_Unmanaged_TSS_Singleton
<TYPE
, ACE_LOCK
>::instance_i ()));
354 ACELIB_DEBUG ((LM_DEBUG
, ACE_END_DUMP
));
355 #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */
356 #endif /* ACE_HAS_DUMP */
359 template <class TYPE
, class ACE_LOCK
>
360 ACE_Unmanaged_TSS_Singleton
<TYPE
, ACE_LOCK
> *&
361 ACE_Unmanaged_TSS_Singleton
<TYPE
, ACE_LOCK
>::instance_i (void)
363 #if defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
364 // Pointer to the Singleton instance. This works around a bug with
365 // G++ and it's (mis-)handling of templates and statics...
366 static ACE_Unmanaged_TSS_Singleton
<TYPE
, ACE_LOCK
> *singleton_
= 0;
370 return ACE_Unmanaged_TSS_Singleton
<TYPE
, ACE_LOCK
>::singleton_
;
371 #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */
374 template <class TYPE
, class ACE_LOCK
> TYPE
*
375 ACE_Unmanaged_TSS_Singleton
<TYPE
, ACE_LOCK
>::instance (void)
377 ACE_TRACE ("ACE_Unmanaged_TSS_Singleton<TYPE, ACE_LOCK>::instance");
379 ACE_Unmanaged_TSS_Singleton
<TYPE
, ACE_LOCK
> *&singleton
=
380 ACE_Unmanaged_TSS_Singleton
<TYPE
, ACE_LOCK
>::instance_i ();
382 // Perform the Double-Check pattern...
385 if (ACE_Object_Manager::starting_up () ||
386 ACE_Object_Manager::shutting_down ())
388 // The program is still starting up, and therefore assumed
389 // to be single threaded. There's no need to double-check.
390 // Or, the ACE_Object_Manager instance has been destroyed,
391 // so the preallocated lock is not available. Either way,
392 // don't register for destruction with the
393 // ACE_Object_Manager: we'll have to leak this instance.
395 ACE_NEW_RETURN (singleton
,
396 (ACE_Unmanaged_TSS_Singleton
<TYPE
, ACE_LOCK
>),
401 #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
402 // Obtain a lock from the ACE_Object_Manager. The pointer
403 // is static, so we only obtain one per
404 // ACE_Unmanaged_Singleton instantiation.
405 #if defined(ACE_FACE_SAFETY_BASE)
406 static ACE_LOCK the_lock
;
407 static ACE_LOCK
*lock
= &the_lock
;
408 #else /* ACE_FACE_SAFETY_BASE */
409 static ACE_LOCK
*lock
= 0;
410 #endif /* ACE_FACE_SAFETY_BASE */
411 if (ACE_Object_Manager::get_singleton_lock (lock
) != 0)
412 // Failed to acquire the lock!
415 ACE_GUARD_RETURN (ACE_LOCK
, ace_mon
, *lock
, 0);
416 #endif /* ACE_MT_SAFE */
419 ACE_NEW_RETURN (singleton
,
420 (ACE_Unmanaged_TSS_Singleton
<TYPE
, ACE_LOCK
>),
425 return ACE_TSS_GET (&singleton
->instance_
, TYPE
);
428 template <class TYPE
, class ACE_LOCK
> void
429 ACE_Unmanaged_TSS_Singleton
<TYPE
, ACE_LOCK
>::close (void)
431 ACE_Unmanaged_TSS_Singleton
<TYPE
, ACE_LOCK
> *&singleton
=
432 ACE_Unmanaged_TSS_Singleton
<TYPE
, ACE_LOCK
>::instance_i ();
435 singleton
->cleanup ();
438 #if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
439 // Pointer to the Singleton instance.
440 template <class TYPE
, class ACE_LOCK
> ACE_TSS_Singleton
<TYPE
, ACE_LOCK
> *
441 ACE_TSS_Singleton
<TYPE
, ACE_LOCK
>::singleton_
= 0;
443 template <class TYPE
, class ACE_LOCK
>
444 ACE_Unmanaged_TSS_Singleton
<TYPE
, ACE_LOCK
> *
445 ACE_Unmanaged_TSS_Singleton
<TYPE
, ACE_LOCK
>::singleton_
= 0;
446 #endif /* !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES) */
448 /*************************************************************************/
450 #if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
451 // Pointer to the Singleton instance.
452 template <class TYPE
, class ACE_LOCK
> ACE_DLL_Singleton_T
<TYPE
, ACE_LOCK
> *
453 ACE_DLL_Singleton_T
<TYPE
, ACE_LOCK
>::singleton_
= 0;
454 #endif /* !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES) */
456 template <class TYPE
, class ACE_LOCK
> void
457 ACE_DLL_Singleton_T
<TYPE
, ACE_LOCK
>::dump (void)
459 #if defined (ACE_HAS_DUMP)
460 ACE_TRACE ("ACE_DLL_Singleton_T<TYPE, ACE_LOCK>::dump");
462 #if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
463 ACELIB_DEBUG ((LM_DEBUG
, ACE_TEXT ("instance_ = %x"),
464 ACE_DLL_Singleton_T
<TYPE
, ACE_LOCK
>::instance_i ()));
465 ACELIB_DEBUG ((LM_DEBUG
, ACE_END_DUMP
));
466 #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */
467 #endif /* ACE_HAS_DUMP */
470 template <class TYPE
, class ACE_LOCK
>
471 ACE_DLL_Singleton_T
<TYPE
, ACE_LOCK
> *&
472 ACE_DLL_Singleton_T
<TYPE
, ACE_LOCK
>::instance_i (void)
474 ACE_TRACE ("ACE_DLL_Singleton_T<TYPE, ACE_LOCK>::instance_i");
476 #if defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
477 // Pointer to the Singleton instance. This works around a bug with
478 // G++ and it's (mis-)handling of templates and statics...
479 static ACE_DLL_Singleton_T
<TYPE
, ACE_LOCK
> *singleton_
= 0;
483 return ACE_DLL_Singleton_T
<TYPE
, ACE_LOCK
>::singleton_
;
484 #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */
487 template <class TYPE
, class ACE_LOCK
> TYPE
*
488 ACE_DLL_Singleton_T
<TYPE
, ACE_LOCK
>::instance (void)
490 ACE_TRACE ("ACE_DLL_Singleton_T<TYPE, ACE_LOCK>::instance");
492 ACE_DLL_Singleton_T
<TYPE
, ACE_LOCK
> *&singleton
=
493 ACE_DLL_Singleton_T
<TYPE
, ACE_LOCK
>::instance_i ();
495 // Perform the Double-Check pattern...
498 if (ACE_Object_Manager::starting_up () ||
499 ACE_Object_Manager::shutting_down ())
501 // The program is still starting up, and therefore assumed
502 // to be single threaded. There's no need to double-check.
503 // Or, the ACE_Object_Manager instance has been destroyed,
504 // so the preallocated lock is not available. Either way,
505 // don't register for destruction with the
506 // ACE_Object_Manager: we'll have to leak this instance.
508 ACE_NEW_RETURN (singleton
, (ACE_DLL_Singleton_T
<TYPE
, ACE_LOCK
>),
513 #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
514 // Obtain a lock from the ACE_Object_Manager. The pointer
515 // is static, so we only obtain one per
516 // ACE_Unmanaged_Singleton instantiation.
517 #if defined(ACE_FACE_SAFETY_BASE)
518 static ACE_LOCK the_lock
;
519 static ACE_LOCK
*lock
= &the_lock
;
520 #else /* ACE_FACE_SAFETY_BASE */
521 static ACE_LOCK
*lock
= 0;
522 #endif /* ACE_FACE_SAFETY_BASE */
523 if (ACE_Object_Manager::get_singleton_lock (lock
) != 0)
524 // Failed to acquire the lock!
527 ACE_GUARD_RETURN (ACE_LOCK
, ace_mon
, *lock
, 0);
528 #endif /* ACE_MT_SAFE */
531 ACE_NEW_RETURN (singleton
,
532 (ACE_DLL_Singleton_T
<TYPE
, ACE_LOCK
>),
535 //ACE_REGISTER_FRAMEWORK_COMPONENT(ACE_DLL_Singleton<TYPE,ACE_LOCK>, singleton);
536 ACE_Framework_Repository::instance ()->register_component
537 (new ACE_Framework_Component_T
<ACE_DLL_Singleton_T
<TYPE
, ACE_LOCK
> > (singleton
));
540 return &singleton
->instance_
;
543 template <class TYPE
, class ACE_LOCK
> void
544 ACE_DLL_Singleton_T
<TYPE
, ACE_LOCK
>::close (void)
546 ACE_TRACE ("ACE_DLL_Singleton_T<TYPE, ACE_LOCK>::close");
548 ACE_DLL_Singleton_T
<TYPE
, ACE_LOCK
> *&singleton
=
549 ACE_DLL_Singleton_T
<TYPE
, ACE_LOCK
>::instance_i ();
555 template <class TYPE
, class ACE_LOCK
> void
556 ACE_DLL_Singleton_T
<TYPE
, ACE_LOCK
>::close_singleton (void)
558 ACE_TRACE ("ACE_DLL_Singleton_T<TYPE, ACE_LOCK>::close_singleton");
559 ACE_DLL_Singleton_T
<TYPE
, ACE_LOCK
>::close ();
562 template <class TYPE
, class ACE_LOCK
> const ACE_TCHAR
*
563 ACE_DLL_Singleton_T
<TYPE
, ACE_LOCK
>::dll_name (void)
565 return this->instance ()->dll_name ();
568 template <class TYPE
, class ACE_LOCK
> const ACE_TCHAR
*
569 ACE_DLL_Singleton_T
<TYPE
, ACE_LOCK
>::name (void)
571 return this->instance ()->name ();
575 /**********************************************************************/
577 template <class TYPE
> const ACE_TCHAR
*
578 ACE_DLL_Singleton_Adapter_T
<TYPE
>::dll_name (void)
580 // @todo make this a constant somewhere (or it there already is one
582 return ACE_TEXT("ACE");
585 ACE_END_VERSIONED_NAMESPACE_DECL
587 #endif /* ACE_SINGLETON_CPP */