diff options
| author | Rickard Andersson <gonz@severnatazvezda.com> | 2023-06-14 23:26:43 +0300 |
|---|---|---|
| committer | Rickard Andersson <gonz@severnatazvezda.com> | 2023-06-14 23:26:43 +0300 |
| commit | d6540d9077cbfe18f0d6804ec2a301c04758c820 (patch) | |
| tree | 9e86e1327ad9ab0133c05ef7404b401c6abe13ab /core/sys/unix | |
| parent | 091c515fea784b639b4a907a2fff4a6c6eef53de (diff) | |
fix(os_linux): call `ppoll` instead on `arm64`
Diffstat (limited to 'core/sys/unix')
| -rw-r--r-- | core/sys/unix/syscalls_linux.odin | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/core/sys/unix/syscalls_linux.odin b/core/sys/unix/syscalls_linux.odin index 54f8bcc25..2e5bad153 100644 --- a/core/sys/unix/syscalls_linux.odin +++ b/core/sys/unix/syscalls_linux.odin @@ -2079,7 +2079,22 @@ sys_select :: proc "contextless" (nfds: int, readfds, writefds, exceptfds: rawpt } sys_poll :: proc "contextless" (fds: rawptr, nfds: uint, timeout: int) -> int { - return int(intrinsics.syscall(SYS_poll, uintptr(fds), uintptr(nfds), uintptr(timeout))) + // NOTE: specialcased here because `arm64` does not have `poll` + when ODIN_ARCH != .arm64 { + // redefined because we can't depend on the `unix` module here + timespec :: struct { + tv_sec: i64, + tv_nsec: i64, + } + seconds := i64(timeout / 1_000) + nanoseconds := i64((timeout % 1000) * 1_000_000) + timeout_spec := timespec{seconds, nanoseconds} + + return int(intrinsics.syscall(SYS_ppoll, uintptr(fds), uintptr(nfds), uintptr(&timeout_spec), uintptr(0), uintptr(8))) + } else { + return int(intrinsics.syscall(SYS_poll, uintptr(fds), uintptr(nfds), uintptr(timeout))) + } + } sys_ppoll :: proc "contextless" (fds: rawptr, nfds: uint, timeout: rawptr, sigmask: rawptr, sigsetsize: uint) -> int { |