mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-07 16:18:52 +00:00
fix wrong ulock timeout calculation, add version check for ios
This commit is contained in:
@@ -12,6 +12,7 @@ foreign System {
|
|||||||
// __ulock_wait is not available on 10.15
|
// __ulock_wait is not available on 10.15
|
||||||
// See https://github.com/odin-lang/Odin/issues/1959
|
// 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_wait :: proc "c" (operation: u32, addr: rawptr, value: u64, timeout_us: u32) -> c.int ---
|
||||||
|
// >= MacOS 11.
|
||||||
__ulock_wait2 :: proc "c" (operation: u32, addr: rawptr, value: u64, timeout_ns: u64, value2: u64) -> 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 ---
|
__ulock_wake :: proc "c" (operation: u32, addr: rawptr, wake_value: u64) -> c.int ---
|
||||||
}
|
}
|
||||||
@@ -57,12 +58,14 @@ _futex_wait_with_timeout :: proc "contextless" (f: ^Futex, expected: u32, durati
|
|||||||
timeout_ns := u64(duration)
|
timeout_ns := u64(duration)
|
||||||
s := __ulock_wait2(UL_COMPARE_AND_WAIT | ULF_NO_ERRNO, f, u64(expected), timeout_ns, 0)
|
s := __ulock_wait2(UL_COMPARE_AND_WAIT | ULF_NO_ERRNO, f, u64(expected), timeout_ns, 0)
|
||||||
} else {
|
} else {
|
||||||
timeout_us := u32(duration) * 1000
|
timeout_us := u32(duration / time.Microsecond)
|
||||||
s := __ulock_wait(UL_COMPARE_AND_WAIT | ULF_NO_ERRNO, f, u64(expected), timeout_us)
|
s := __ulock_wait(UL_COMPARE_AND_WAIT | ULF_NO_ERRNO, f, u64(expected), timeout_us)
|
||||||
}
|
}
|
||||||
|
|
||||||
if s >= 0 {
|
if s >= 0 {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
switch s {
|
switch s {
|
||||||
case EINTR, EFAULT:
|
case EINTR, EFAULT:
|
||||||
return true
|
return true
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ foreign import system "system:System.framework"
|
|||||||
// #define OS_WAIT_ON_ADDR_AVAILABILITY \
|
// #define OS_WAIT_ON_ADDR_AVAILABILITY \
|
||||||
// __API_AVAILABLE(macos(14.4), ios(17.4), tvos(17.4), watchos(10.4))
|
// __API_AVAILABLE(macos(14.4), ios(17.4), tvos(17.4), watchos(10.4))
|
||||||
when ODIN_OS == .Darwin {
|
when ODIN_OS == .Darwin {
|
||||||
|
|
||||||
when ODIN_PLATFORM_SUBTARGET == .iOS && ODIN_MINIMUM_OS_VERSION >= 17_04_00 {
|
when ODIN_PLATFORM_SUBTARGET == .iOS && ODIN_MINIMUM_OS_VERSION >= 17_04_00 {
|
||||||
WAIT_ON_ADDRESS_AVAILABLE :: true
|
WAIT_ON_ADDRESS_AVAILABLE :: true
|
||||||
} else when ODIN_MINIMUM_OS_VERSION >= 14_04_00 {
|
} else when ODIN_MINIMUM_OS_VERSION >= 14_04_00 {
|
||||||
@@ -12,7 +13,10 @@ when ODIN_OS == .Darwin {
|
|||||||
} else {
|
} else {
|
||||||
WAIT_ON_ADDRESS_AVAILABLE :: false
|
WAIT_ON_ADDRESS_AVAILABLE :: false
|
||||||
}
|
}
|
||||||
when ODIN_MINIMUM_OS_VERSION >= 11_00_00 {
|
|
||||||
|
when ODIN_PLATFORM_SUBTARGET == .iOS && ODIN_MINIMUM_OS_VERSION >= 14_00_00 {
|
||||||
|
ULOCK_WAIT_2_AVAILABLE :: true
|
||||||
|
} else when ODIN_MINIMUM_OS_VERSION >= 11_00_00 {
|
||||||
ULOCK_WAIT_2_AVAILABLE :: true
|
ULOCK_WAIT_2_AVAILABLE :: true
|
||||||
} else {
|
} else {
|
||||||
ULOCK_WAIT_2_AVAILABLE :: false
|
ULOCK_WAIT_2_AVAILABLE :: false
|
||||||
|
|||||||
Reference in New Issue
Block a user