Skip to content

Commit efbd273

Browse files
neakorrudro
authored andcommitted
Fix deprecated atomic APIs used in AtomicReference (#27)
1 parent 9c2d8fb commit efbd273

File tree

6 files changed

+9
-32
lines changed

6 files changed

+9
-32
lines changed

Sources/Concurrency/AtomicReference.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import Foundation
1818
import libkern
19+
import ObjCBridges
1920

2021
/// A concurrency utility class that supports locking-free synchronization on mutating an object
2122
/// reference. Unlike using a lock, concurrent read and write accesses to this class is allowed. At
@@ -28,7 +29,7 @@ public class AtomicReference<ValueType> {
2829
get {
2930
// Create a memory barrier to ensure the entire memory stack is in sync so we
3031
// can safely retrieve the value. This guarantees the initial value is in sync.
31-
OSMemoryBarrier()
32+
atomic_thread_fence(memory_order_seq_cst)
3233
return wrappedValue
3334
}
3435
set {
@@ -59,7 +60,7 @@ public class AtomicReference<ValueType> {
5960
let expectPointer = unsafePassUnretainedPointer(value: expect)
6061
let newValuePointer = unsafePassUnretainedPointer(value: newValue)
6162

62-
if OSAtomicCompareAndSwapPtrBarrier(expectPointer, newValuePointer, pointer) {
63+
if AtomicBridges.comparePointer(pointer, withExpectedPointer: expectPointer, andSwapPointer: newValuePointer) {
6364
// If pointer swap succeeded, a memory berrier is created, so we can safely write the new
6465
// value.
6566
wrappedValue = newValue

Sources/ObjCBridges/AtomicBridges.m

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,8 @@ + (bool)compare:(_Atomic(long) *)value withExpected:(long *)expected andSwap:(lo
3030
return atomic_compare_exchange_strong(value, expected, desired);
3131
}
3232

33+
+ (bool)comparePointer:(void * volatile *)value withExpectedPointer:(void *)expected andSwapPointer:(void *)desired {
34+
return __sync_bool_compare_and_swap(value, expected, desired);
35+
}
36+
3337
@end

Sources/ObjCBridges/include/AtomicBridges.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ NS_ASSUME_NONNULL_BEGIN
2727

2828
+ (bool)compare:(_Atomic(long) *)value withExpected:(long *)expected andSwap:(long)desired;
2929

30+
+ (bool)comparePointer:(void * _Nullable volatile * _Nonnull)value withExpectedPointer:(void *)expected andSwapPointer:(void *)desired;
31+
3032
@end
3133

3234
NS_ASSUME_NONNULL_END

Tests/ConcurrencyTests/AtomicIntTests.swift

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,6 @@ import XCTest
1919

2020
class AtomicIntTests: XCTestCase {
2121

22-
static var allTests = [
23-
("test_init_verifyInitialValue", test_init_verifyInitialValue),
24-
("test_initGetSet_verifySetToNewValue", test_initGetSet_verifySetToNewValue),
25-
("test_compareAndSet_verifySettingNewValue", test_compareAndSet_verifySettingNewValue),
26-
("test_compareAndSet_withFalseExpectValue_verifyNotSettingNewValue", test_compareAndSet_withFalseExpectValue_verifyNotSettingNewValue),
27-
("test_getAndSet_verifySettingNewValueReturningOldValue", test_getAndSet_verifySettingNewValueReturningOldValue),
28-
("test_incrementAndGet_verifyNewValue", test_incrementAndGet_verifyNewValue),
29-
("test_decrementAndGet_verifyNewValue", test_decrementAndGet_verifyNewValue),
30-
("test_getAndIncrement_verifyNewValue", test_getAndIncrement_verifyNewValue),
31-
("test_getAndDecrement_verifyNewValue", test_getAndDecrement_verifyNewValue),
32-
]
33-
3422
func test_init_verifyInitialValue() {
3523
let initialValue = 123
3624
let atomicInt = AtomicInt(initialValue: initialValue)

Tests/ConcurrencyTests/AtomicReferenceTests.swift

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,6 @@ import XCTest
1919

2020
class AtomicReferenceTests: XCTestCase {
2121

22-
static var allTests = [
23-
("test_init_verifyInitialValue", test_init_verifyInitialValue),
24-
("test_initGetSet_verifySetToNewValue", test_initGetSet_verifySetToNewValue),
25-
("test_compareAndSet_verifySettingNewValue", test_compareAndSet_verifySettingNewValue),
26-
("test_compareAndSet_withFalseExpectValue_verifyNotSettingNewValue", test_compareAndSet_withFalseExpectValue_verifyNotSettingNewValue),
27-
("test_compareAndSet_withNil_verifySettingNewValue", test_compareAndSet_withNil_verifySettingNewValue),
28-
("test_getAndSet_verifySettingNewValueReturningOldValue", test_getAndSet_verifySettingNewValueReturningOldValue),
29-
("test_compareAndSet_initialNilThenResetToNil_verifySuccess", test_compareAndSet_initialNilThenResetToNil_verifySuccess),
30-
]
31-
3222
func test_init_verifyInitialValue() {
3323
let initialValue = NSObject()
3424
let atomicRef = AtomicReference<NSObject>(initialValue: initialValue)

Tests/ConcurrencyTests/CountDownLatchTests.swift

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,6 @@ import XCTest
1919

2020
class CountDownLatchTests: XCTestCase {
2121

22-
static var allTests = [
23-
("test_countDown_await_verifyCompletionWithTrue", test_countDown_await_verifyCompletionWithTrue),
24-
("test_countDown_await_withTimeout_verifyCompletionWithFalse", test_countDown_await_withTimeout_verifyCompletionWithFalse),
25-
("test_countDown_await_verifyDuplicateCountDown_verifyDuplicateAwaitCompletesWithTrue", test_countDown_await_verifyDuplicateCountDown_verifyDuplicateAwaitCompletesWithTrue),
26-
("test_multipleAwaitBeforeCountDown_verifyCompletesWithTrue", test_multipleAwaitBeforeCountDown_verifyCompletesWithTrue),
27-
("test_multipleAsyncAwaitBeforeCountDown_verifyCompletesWithTrue", test_multipleAsyncAwaitBeforeCountDown_verifyCompletesWithTrue),
28-
]
29-
3022
func test_countDown_await_verifyCompletionWithTrue() {
3123
let latch = CountDownLatch(count: 3)
3224

0 commit comments

Comments
 (0)