1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
// 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 <class TYPE, class LOCK> void
ACE_Singleton<TYPE, LOCK>::dump (void)
{
ACE_TRACE ("ACE_Singleton<TYPE, LOCK>::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 <class TYPE, class LOCK> TYPE *
ACE_Singleton<TYPE, LOCK>::instance (void)
{
ACE_TRACE ("ACE_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;
// 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)
ACE_NEW_RETURN (instance_, TYPE, 0);
}
return instance_;
#else
// Perform the Double-Check pattern...
if (ACE_Singleton<TYPE, LOCK>::instance_ == 0)
{
ACE_GUARD_RETURN (LOCK, ace_mon, (ACE_Singleton<TYPE, LOCK>::ace_singleton_lock_), 0);
if (ACE_Singleton<TYPE, LOCK>::instance_ == 0)
ACE_NEW_RETURN ((ACE_Singleton<TYPE, LOCK>::instance_), TYPE, 0);
}
return ACE_Singleton<TYPE, LOCK>::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> TYPE *
ACE_Singleton<TYPE, LOCK>::instance_ = 0;
// Lock the creation of the singleton.
template <class TYPE, class LOCK> LOCK
ACE_Singleton<TYPE, LOCK>::ace_singleton_lock_;
#endif /* !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES) */
#endif /* ACE_SINGLETON_C */
|