From 95d5d71d510cc33b198ec1447b71467816b1e093 Mon Sep 17 00:00:00 2001 From: Kuba Mracek Date: Mon, 30 Oct 2023 09:10:30 -0700 Subject: [PATCH] [embedded] Add asserts on predicate value into swift_once --- stdlib/public/core/EmbeddedRuntime.swift | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/stdlib/public/core/EmbeddedRuntime.swift b/stdlib/public/core/EmbeddedRuntime.swift index 8cf8f69e11e..206c7bfd44e 100644 --- a/stdlib/public/core/EmbeddedRuntime.swift +++ b/stdlib/public/core/EmbeddedRuntime.swift @@ -241,7 +241,13 @@ public func swift_endAccess(buffer: UnsafeMutableRawPointer) { @_silgen_name("swift_once") public func swift_once(predicate: UnsafeMutablePointer, 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) if won { @@ -251,7 +257,7 @@ public func swift_once(predicate: UnsafeMutablePointer, fn: (@convention(c) } // TODO: This should really use an OS provided lock - while loadAcquire(predicate) >= 0 { + while checkedLoadAcquire(predicate) >= 0 { // spin } }