[embedded] Add asserts on predicate value into swift_once

This commit is contained in:
Kuba Mracek
2023-10-30 09:10:30 -07:00
parent b057417e52
commit 95d5d71d51

View File

@@ -241,7 +241,13 @@ public func swift_endAccess(buffer: UnsafeMutableRawPointer) {
@_silgen_name("swift_once") @_silgen_name("swift_once")
public func swift_once(predicate: UnsafeMutablePointer<Int>, fn: (@convention(c) (UnsafeMutableRawPointer)->()), context: UnsafeMutableRawPointer) { public func swift_once(predicate: UnsafeMutablePointer<Int>, fn: (@convention(c) (UnsafeMutableRawPointer)->()), context: UnsafeMutableRawPointer) {
if loadAcquire(predicate) < 0 { return } let checkedLoadAcquire = { predicate in
let value = loadAcquire(predicate)
assert(value == -1 || value == 0 || value == 1)
return value
}
if checkedLoadAcquire(predicate) < 0 { return }
let won = compareExchangeRelaxed(predicate, expectedOldValue: 0, desiredNewValue: 1) let won = compareExchangeRelaxed(predicate, expectedOldValue: 0, desiredNewValue: 1)
if won { if won {
@@ -251,7 +257,7 @@ public func swift_once(predicate: UnsafeMutablePointer<Int>, fn: (@convention(c)
} }
// TODO: This should really use an OS provided lock // TODO: This should really use an OS provided lock
while loadAcquire(predicate) >= 0 { while checkedLoadAcquire(predicate) >= 0 {
// spin // spin
} }
} }