Skip to content

Commit ae06786

Browse files
authored
Fix AtomicBox deinit issue (#266)
1 parent bb75620 commit ae06786

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

Sources/OpenSwiftUICore/Util/ThreadUtils.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,12 @@ private final class AtomicBuffer<Value>: ManagedBuffer<os_unfair_lock_s, Value>
9595
}
9696
return unsafeDowncast(buffer, to: AtomicBuffer<Value>.self)
9797
}
98+
99+
deinit {
100+
withUnsafeMutablePointerToElements { pointer in
101+
_ = pointer.deinitialize(count: 1)
102+
}
103+
}
98104
}
99105
#else
100106
private final class AtomicBuffer<Value>: ManagedBuffer<NSLock, Value> {
@@ -107,6 +113,12 @@ private final class AtomicBuffer<Value>: ManagedBuffer<NSLock, Value> {
107113
}
108114
return unsafeDowncast(buffer, to: AtomicBuffer<Value>.self)
109115
}
116+
117+
deinit {
118+
withUnsafeMutablePointerToElements { pointer in
119+
_ = pointer.deinitialize(count: 1)
120+
}
121+
}
110122
}
111123
#endif
112124

Tests/OpenSwiftUICoreTests/Util/ThreadUtilsTests.swift

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,27 @@ struct AtomicBoxTests {
5555
@AtomicBox var box: Int = 3
5656
#expect($box.access { $0.description } == "3")
5757
}
58+
59+
@Test
60+
func deinitCheck() async throws {
61+
final class DeinitCheck {
62+
let confirmation: Confirmation
63+
64+
init(confirmation: Confirmation) {
65+
self.confirmation = confirmation
66+
}
67+
68+
deinit {
69+
confirmation()
70+
}
71+
}
72+
73+
func deinitCheck(_ confirmation: Confirmation) {
74+
@AtomicBox var check = DeinitCheck(confirmation: confirmation)
75+
}
76+
77+
await confirmation { confirmation in
78+
deinitCheck(confirmation)
79+
}
80+
}
5881
}

0 commit comments

Comments
 (0)