17
17
@available ( SwiftStdlib 6 . 0 , * )
18
18
@frozen
19
19
@_staticExclusiveOnly
20
+ @safe
20
21
public struct AtomicLazyReference < Instance: AnyObject > : ~ Copyable {
21
22
@usableFromInline
22
23
let storage : Atomic < Unmanaged < Instance > ? >
23
24
24
25
@available ( SwiftStdlib 6 . 0 , * )
25
26
@inlinable
26
27
public init ( ) {
27
- storage = Atomic < Unmanaged < Instance > ? > ( nil )
28
+ storage = unsafe Atomic< Unmanaged < Instance > ? > ( nil )
28
29
}
29
30
30
31
@inlinable
31
32
deinit {
32
- if let unmanaged = storage. load ( ordering: . acquiring) {
33
- unmanaged. release ( )
33
+ if let unmanaged = unsafe storage. load ( ordering: . acquiring) {
34
+ unsafe unmanaged. release ( )
34
35
}
35
36
}
36
37
}
@@ -68,8 +69,8 @@ extension AtomicLazyReference {
68
69
/// was passed to this function.
69
70
@available ( SwiftStdlib 6 . 0 , * )
70
71
public func storeIfNil( _ desired: consuming Instance ) -> Instance {
71
- let desiredUnmanaged = Unmanaged . passRetained ( desired)
72
- let ( exchanged, current) = storage. compareExchange (
72
+ let desiredUnmanaged = unsafe Unmanaged. passRetained ( desired)
73
+ let ( exchanged, current) = unsafe storage. compareExchange (
73
74
expected: nil ,
74
75
desired: desiredUnmanaged,
75
76
ordering: . acquiringAndReleasing
@@ -78,11 +79,11 @@ extension AtomicLazyReference {
78
79
if !exchanged {
79
80
// The reference has already been initialized. Balance the retain that we
80
81
// performed on 'desired'.
81
- desiredUnmanaged. release ( )
82
- return current!. takeUnretainedValue ( )
82
+ unsafe desiredUnmanaged. release ( )
83
+ return unsafe current! . takeUnretainedValue ( )
83
84
}
84
85
85
- return desiredUnmanaged. takeUnretainedValue ( )
86
+ return unsafe desiredUnmanaged. takeUnretainedValue ( )
86
87
}
87
88
88
89
/// Atomically loads and returns the current value of this reference.
@@ -94,8 +95,8 @@ extension AtomicLazyReference {
94
95
/// `nil` if it has not been written to yet.
95
96
@available ( SwiftStdlib 6 . 0 , * )
96
97
public func load( ) -> Instance ? {
97
- let value = storage. load ( ordering: . acquiring)
98
- return value? . takeUnretainedValue ( )
98
+ let value = unsafe storage. load ( ordering: . acquiring)
99
+ return unsafe value? . takeUnretainedValue ( )
99
100
}
100
101
}
101
102
0 commit comments