Skip to content

Commit efe6d54

Browse files
committed
[test] More Atomic<T> adoption
1 parent c63d43f commit efe6d54

File tree

2 files changed

+32
-7
lines changed

2 files changed

+32
-7
lines changed

Tests/AtomicsTests/StrongReferenceShuffle.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ private let nodeCount = ManagedAtomic<Int>(0)
3131

3232
private class List<Value: Equatable> {
3333
final class Node: AtomicReference {
34-
private let _next: UnsafeAtomic<Node?>
35-
private let _value: UnsafeAtomic<UnsafeMutablePointer<Value>?>
34+
private let _next: Atomic<Node?>
35+
private let _value: Atomic<UnsafeMutablePointer<Value>?>
3636

3737
init(pointer: UnsafeMutablePointer<Value>?, next: Node? = nil) {
38-
self._next = .create(next)
39-
self._value = .create(pointer)
38+
self._next = .init(next)
39+
self._value = .init(pointer)
4040
nodeCount.wrappingIncrement(ordering: .relaxed)
4141
}
4242

@@ -52,14 +52,14 @@ private class List<Value: Equatable> {
5252

5353
deinit {
5454
// Prevent stack overflow when deinitializing a long chain
55-
var node = self._next.destroy()
55+
var node = self.clearNext()
5656
while node != nil && isKnownUniquelyReferenced(&node) {
57-
let next = node!._next.exchange(nil, ordering: .relaxed)
57+
let next = node!.clearNext()
5858
withExtendedLifetime(node) {}
5959
node = next
6060
}
6161

62-
if let p = self._value.destroy() {
62+
if let p = self.clearValue() {
6363
p.deinitialize(count: 1)
6464
p.deallocate()
6565
}

Tests/AtomicsTests/StrongReferenceSubclass.swift

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,19 @@ private class Child: Base {}
2525
private class Grandchild: Child {}
2626

2727
class StrongReferenceSubclass: XCTestCase {
28+
func test_base_noncopyable() {
29+
let object = Child(42)
30+
let v = Atomic<Base>(object)
31+
32+
XCTAssertTrue(v.load(ordering: .relaxed) === object)
33+
34+
let object2 = Grandchild(23)
35+
let o = v.exchange(object2, ordering: .relaxed)
36+
XCTAssertTrue(o === object)
37+
38+
XCTAssertTrue(v.load(ordering: .relaxed) === object2)
39+
}
40+
2841
func test_base_unsafe() {
2942
let object = Child(42)
3043
let v = UnsafeAtomic<Base>.create(object)
@@ -54,6 +67,18 @@ class StrongReferenceSubclass: XCTestCase {
5467
XCTAssertTrue(v.load(ordering: .relaxed) === object2)
5568
}
5669

70+
func test_optional_base() {
71+
let v = Atomic<Base?>(nil)
72+
73+
XCTAssertTrue(v.load(ordering: .relaxed) == nil)
74+
75+
let object = Grandchild(23)
76+
let o = v.exchange(object, ordering: .relaxed)
77+
XCTAssertTrue(o == nil)
78+
79+
XCTAssertTrue(v.load(ordering: .relaxed) === object)
80+
}
81+
5782
func test_optional_base_unsafe() {
5883
let v = UnsafeAtomic<Base?>.create(nil)
5984

0 commit comments

Comments
 (0)