futex_linux.c raw
1 //go:build none
2
3 // This file is manually included, to avoid CGo which would cause a circular
4 // import.
5
6 #include <limits.h>
7 #include <stdint.h>
8 #include <sys/syscall.h>
9 #include <time.h>
10 #include <unistd.h>
11
12 #define FUTEX_WAIT 0
13 #define FUTEX_WAKE 1
14 #define FUTEX_PRIVATE_FLAG 128
15
16 void moxie_futex_wait(uint32_t *addr, uint32_t cmp) {
17 syscall(SYS_futex, addr, FUTEX_WAIT|FUTEX_PRIVATE_FLAG, cmp, NULL, NULL, 0);
18 }
19
20 void moxie_futex_wait_timeout(uint32_t *addr, uint32_t cmp, uint64_t timeout) {
21 struct timespec ts = {0};
22 ts.tv_sec = timeout / 1000000000;
23 ts.tv_nsec = timeout % 1000000000;
24 syscall(SYS_futex, addr, FUTEX_WAIT|FUTEX_PRIVATE_FLAG, cmp, &ts, NULL, 0);
25 }
26
27 void moxie_futex_wake(uint32_t *addr) {
28 syscall(SYS_futex, addr, FUTEX_WAKE|FUTEX_PRIVATE_FLAG, 1, NULL, NULL, 0);
29 }
30
31 void moxie_futex_wake_all(uint32_t *addr) {
32 syscall(SYS_futex, addr, FUTEX_WAKE|FUTEX_PRIVATE_FLAG, INT_MAX, NULL, NULL, 0);
33 }
34