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