aboutsummaryrefslogtreecommitdiff
path: root/core/sys/unix
diff options
context:
space:
mode:
authorRickard Andersson <gonz@severnatazvezda.com>2023-06-14 23:26:43 +0300
committerRickard Andersson <gonz@severnatazvezda.com>2023-06-14 23:26:43 +0300
commitd6540d9077cbfe18f0d6804ec2a301c04758c820 (patch)
tree9e86e1327ad9ab0133c05ef7404b401c6abe13ab /core/sys/unix
parent091c515fea784b639b4a907a2fff4a6c6eef53de (diff)
fix(os_linux): call `ppoll` instead on `arm64`
Diffstat (limited to 'core/sys/unix')
-rw-r--r--core/sys/unix/syscalls_linux.odin17
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 {