aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2024-09-17 11:35:18 +0100
committerGitHub <noreply@github.com>2024-09-17 11:35:18 +0100
commit4a3b4da73c13f4f72df50d11b298b2bda44bbd79 (patch)
tree1568b1707733a88714d118d84512be954921ded2
parent09588836e73d2def550cf5b1f6dab4d9de237e37 (diff)
parent6e0f1cc866e8a566a46ccaf9f14879e7ac344fe2 (diff)
Merge pull request #4253 from pkova/master
Fix core sync test deadlock on darwin
-rw-r--r--core/sync/futex_darwin.odin10
-rw-r--r--core/sys/darwin/sync.odin7
-rw-r--r--tests/core/sync/test_core_sync.odin4
3 files changed, 15 insertions, 6 deletions
diff --git a/core/sync/futex_darwin.odin b/core/sync/futex_darwin.odin
index daefd6699..32fdb1552 100644
--- a/core/sync/futex_darwin.odin
+++ b/core/sync/futex_darwin.odin
@@ -12,6 +12,7 @@ foreign System {
// __ulock_wait is not available on 10.15
// See https://github.com/odin-lang/Odin/issues/1959
__ulock_wait :: proc "c" (operation: u32, addr: rawptr, value: u64, timeout_us: u32) -> c.int ---
+ __ulock_wait2 :: proc "c" (operation: u32, addr: rawptr, value: u64, timeout_ns: u64, value2: u64) -> c.int ---
__ulock_wake :: proc "c" (operation: u32, addr: rawptr, wake_value: u64) -> c.int ---
}
@@ -52,8 +53,13 @@ _futex_wait_with_timeout :: proc "contextless" (f: ^Futex, expected: u32, durati
}
} else {
- timeout_ns := u32(duration)
- s := __ulock_wait(UL_COMPARE_AND_WAIT | ULF_NO_ERRNO, f, u64(expected), timeout_ns)
+ when darwin.ULOCK_WAIT_2_AVAILABLE {
+ timeout_ns := u64(duration)
+ s := __ulock_wait2(UL_COMPARE_AND_WAIT | ULF_NO_ERRNO, f, u64(expected), timeout_ns, 0)
+ } else {
+ timeout_us := u32(duration) * 1000
+ s := __ulock_wait(UL_COMPARE_AND_WAIT | ULF_NO_ERRNO, f, u64(expected), timeout_us)
+ }
if s >= 0 {
return true
}
diff --git a/core/sys/darwin/sync.odin b/core/sys/darwin/sync.odin
index 121d3edef..e90f30162 100644
--- a/core/sys/darwin/sync.odin
+++ b/core/sys/darwin/sync.odin
@@ -12,8 +12,15 @@ when ODIN_OS == .Darwin {
} else {
WAIT_ON_ADDRESS_AVAILABLE :: false
}
+ when ODIN_MINIMUM_OS_VERSION >= 11_00_00 {
+ ULOCK_WAIT_2_AVAILABLE :: true
+ } else {
+ ULOCK_WAIT_2_AVAILABLE :: false
+ }
+
} else {
WAIT_ON_ADDRESS_AVAILABLE :: false
+ ULOCK_WAIT_2_AVAILABLE :: false
}
os_sync_wait_on_address_flag :: enum u32 {
diff --git a/tests/core/sync/test_core_sync.odin b/tests/core/sync/test_core_sync.odin
index 32c08f935..d6a7a9517 100644
--- a/tests/core/sync/test_core_sync.odin
+++ b/tests/core/sync/test_core_sync.odin
@@ -4,11 +4,7 @@
// Keep in mind that running with the debug logs uncommented can result in
// failures disappearing due to the delay of sending the log message causing
// different synchronization patterns.
-//
-// These tests are temporarily disabled on Darwin, as there is currently a
-// stall occurring which I cannot debug.
-//+build !darwin
package test_core_sync
import "base:intrinsics"