15
15
16
16
#include < memory>
17
17
18
- #if SWIFT_STDLIB_THREADING_NONE
19
- // No dependencies on single-threaded environments.
20
- #elif SWIFT_STDLIB_THREADING_DARWIN
21
- #include < dispatch/dispatch.h>
22
- #else
23
- #include < mutex>
24
- #endif
25
-
26
18
#include " swift/Basic/Malloc.h"
27
19
#include " swift/Basic/type_traits.h"
20
+ #include " swift/Threading/Once.h"
28
21
29
22
namespace swift {
30
23
31
- #if SWIFT_STDLIB_THREADING_NONE
32
- using OnceToken_t = bool ;
33
- # define SWIFT_ONCE_F (TOKEN, FUNC, CONTEXT ) \
34
- do { if (!TOKEN) { TOKEN = true ; (FUNC)(CONTEXT); } } while (0 )
35
- #elif SWIFT_STDLIB_THREADING_DARWIN
36
- using OnceToken_t = ::dispatch_once_t ;
37
- # define SWIFT_ONCE_F (TOKEN, FUNC, CONTEXT ) \
38
- ::dispatch_once_f (&TOKEN, CONTEXT, FUNC)
39
- #elif defined(__CYGWIN__)
40
- // _swift_once_f() is declared in Private.h.
41
- // This prototype is copied instead including the header file.
42
- void _swift_once_f (uintptr_t *predicate, void *context,
43
- void (*function)(void *));
44
- using OnceToken_t = unsigned long ;
45
- # define SWIFT_ONCE_F (TOKEN, FUNC, CONTEXT ) \
46
- _swift_once_f (&TOKEN, CONTEXT, FUNC)
47
- #else
48
- using OnceToken_t = std::once_flag;
49
- # define SWIFT_ONCE_F (TOKEN, FUNC, CONTEXT ) \
50
- ::std::call_once (TOKEN, FUNC, CONTEXT)
51
- #endif
52
-
53
24
// / A template for lazily-constructed, zero-initialized, leaked-on-exit
54
25
// / global objects.
55
26
template <class T > class Lazy {
56
27
alignas (T) char Value[sizeof (T)] = { 0 };
57
28
58
- OnceToken_t OnceToken = {};
29
+ swift:: once_t OnceToken = {};
59
30
60
31
static void defaultInitCallback (void *ValueAddr) {
61
32
::new (ValueAddr) T ();
62
33
}
63
-
34
+
64
35
public:
65
36
using Type = T;
66
-
37
+
67
38
T &get (void (*initCallback)(void *) = defaultInitCallback);
68
39
69
40
template <typename Arg1>
@@ -87,7 +58,7 @@ template <typename T> inline T &Lazy<T>::get(void (*initCallback)(void*)) {
87
58
static_assert (std::is_literal_type<Lazy<T>>::value,
88
59
" Lazy<T> must be a literal type" );
89
60
90
- SWIFT_ONCE_F (OnceToken, initCallback, &Value);
61
+ swift::once (OnceToken, initCallback, &Value);
91
62
return unsafeGetAlreadyInitialized ();
92
63
}
93
64
@@ -103,7 +74,7 @@ template <typename Arg1> inline T &Lazy<T>::getWithInit(Arg1 &&arg1) {
103
74
}
104
75
} data{&Value, static_cast <Arg1&&>(arg1)};
105
76
106
- SWIFT_ONCE_F (OnceToken, &Data::init, &data);
77
+ swift::once (OnceToken, &Data::init, &data);
107
78
return unsafeGetAlreadyInitialized ();
108
79
}
109
80
0 commit comments