@@ -19,6 +19,7 @@ where Value.AtomicRepresentation.Value == Value {
19
19
// (We'd need one set of implementations for the type equality condition, and
20
20
// another for `Value: AtomicReference`.)
21
21
22
+ #if compiler(>=5.9) && $RawLayout
22
23
@usableFromInline
23
24
internal let _storage : Atomic < Value >
24
25
@@ -28,6 +29,34 @@ where Value.AtomicRepresentation.Value == Value {
28
29
public init ( _ value: Value ) {
29
30
_storage = Atomic ( value)
30
31
}
32
+ #else
33
+ @usableFromInline
34
+ internal typealias _Storage = Value . AtomicRepresentation
35
+
36
+ /// The atomic representation of the value stored inside.
37
+ ///
38
+ /// Warning: This ivar must only ever be accessed via `_ptr` after
39
+ /// its initialization.
40
+ @usableFromInline
41
+ internal var _storage : _Storage
42
+
43
+ /// Initialize a new managed atomic instance holding the specified initial
44
+ /// value.
45
+ @inline ( __always) @_alwaysEmitIntoClient
46
+ public init ( _ value: Value ) {
47
+ _storage = _Storage ( value)
48
+ }
49
+
50
+ deinit {
51
+ _ = _ptr. pointee. dispose ( )
52
+ }
53
+
54
+ @_alwaysEmitIntoClient @inline ( __always)
55
+ internal var _ptr : UnsafeMutablePointer < _Storage > {
56
+ _getUnsafePointerToStoredProperties ( self )
57
+ . assumingMemoryBound ( to: _Storage. self)
58
+ }
59
+ #endif
31
60
}
32
61
33
62
extension ManagedAtomic : @unchecked Sendable where Value: Sendable { }
@@ -43,7 +72,11 @@ extension ManagedAtomic {
43
72
public func load(
44
73
ordering: AtomicLoadOrdering
45
74
) -> Value {
75
+ #if compiler(>=5.9) && $RawLayout
46
76
_storage. load ( ordering: ordering)
77
+ #else
78
+ _Storage. atomicLoad ( at: _ptr, ordering: ordering)
79
+ #endif
47
80
}
48
81
49
82
/// Atomically sets the current value to `desired`, applying the specified
@@ -57,7 +90,11 @@ extension ManagedAtomic {
57
90
_ desired: __owned Value,
58
91
ordering: AtomicStoreOrdering
59
92
) {
93
+ #if compiler(>=5.9) && $RawLayout
60
94
_storage. store ( desired, ordering: ordering)
95
+ #else
96
+ _Storage. atomicStore ( desired, at: _ptr, ordering: ordering)
97
+ #endif
61
98
}
62
99
63
100
/// Atomically sets the current value to `desired` and returns the original
@@ -72,7 +109,11 @@ extension ManagedAtomic {
72
109
_ desired: __owned Value,
73
110
ordering: AtomicUpdateOrdering
74
111
) -> Value {
112
+ #if compiler(>=5.9) && $RawLayout
75
113
_storage. exchange ( desired, ordering: ordering)
114
+ #else
115
+ _Storage. atomicExchange ( desired, at: _ptr, ordering: ordering)
116
+ #endif
76
117
}
77
118
78
119
/// Perform an atomic compare and exchange operation on the current value,
@@ -105,8 +146,16 @@ extension ManagedAtomic {
105
146
desired: __owned Value,
106
147
ordering: AtomicUpdateOrdering
107
148
) -> ( exchanged: Bool , original: Value ) {
149
+ #if compiler(>=5.9) && $RawLayout
108
150
_storage. compareExchange (
109
151
expected: expected, desired: desired, ordering: ordering)
152
+ #else
153
+ _Storage. atomicCompareExchange (
154
+ expected: expected,
155
+ desired: desired,
156
+ at: _ptr,
157
+ ordering: ordering)
158
+ #endif
110
159
}
111
160
112
161
/// Perform an atomic compare and exchange operation on the current value,
@@ -147,11 +196,20 @@ extension ManagedAtomic {
147
196
successOrdering: AtomicUpdateOrdering ,
148
197
failureOrdering: AtomicLoadOrdering
149
198
) -> ( exchanged: Bool , original: Value ) {
199
+ #if compiler(>=5.9) && $RawLayout
150
200
_storage. compareExchange (
151
201
expected: expected,
152
202
desired: desired,
153
203
successOrdering: successOrdering,
154
204
failureOrdering: failureOrdering)
205
+ #else
206
+ _Storage. atomicCompareExchange (
207
+ expected: expected,
208
+ desired: desired,
209
+ at: _ptr,
210
+ successOrdering: successOrdering,
211
+ failureOrdering: failureOrdering)
212
+ #endif
155
213
}
156
214
157
215
/// Perform an atomic weak compare and exchange operation on the current
@@ -187,10 +245,18 @@ extension ManagedAtomic {
187
245
desired: __owned Value,
188
246
ordering: AtomicUpdateOrdering
189
247
) -> ( exchanged: Bool , original: Value ) {
248
+ #if compiler(>=5.9) && $RawLayout
190
249
_storage. weakCompareExchange (
191
250
expected: expected,
192
251
desired: desired,
193
252
ordering: ordering)
253
+ #else
254
+ _Storage. atomicWeakCompareExchange (
255
+ expected: expected,
256
+ desired: desired,
257
+ at: _ptr,
258
+ ordering: ordering)
259
+ #endif
194
260
}
195
261
196
262
/// Perform an atomic weak compare and exchange operation on the current
@@ -234,10 +300,19 @@ extension ManagedAtomic {
234
300
successOrdering: AtomicUpdateOrdering ,
235
301
failureOrdering: AtomicLoadOrdering
236
302
) -> ( exchanged: Bool , original: Value ) {
303
+ #if compiler(>=5.9) && $RawLayout
237
304
_storage. weakCompareExchange (
238
305
expected: expected,
239
306
desired: desired,
240
307
successOrdering: successOrdering,
241
308
failureOrdering: failureOrdering)
309
+ #else
310
+ _Storage. atomicWeakCompareExchange (
311
+ expected: expected,
312
+ desired: desired,
313
+ at: _ptr,
314
+ successOrdering: successOrdering,
315
+ failureOrdering: failureOrdering)
316
+ #endif
242
317
}
243
318
}
0 commit comments