Browse Source

Merge pull request #4253 from pkova/master

Fix core sync test deadlock on darwin
gingerBill 11 months ago
parent
commit
4a3b4da73c
3 changed files with 15 additions and 6 deletions
  1. 8 2
      core/sync/futex_darwin.odin
  2. 7 0
      core/sys/darwin/sync.odin
  3. 0 4
      tests/core/sync/test_core_sync.odin

+ 8 - 2
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
 	}

+ 7 - 0
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 {

+ 0 - 4
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"