diff options
| author | Colin Davidson <colrdavidson@gmail.com> | 2022-12-29 11:46:43 -0800 |
|---|---|---|
| committer | Colin Davidson <colrdavidson@gmail.com> | 2022-12-29 11:46:43 -0800 |
| commit | 98e5523f2f6d36960d32041a2d5a1de96ef6e5a5 (patch) | |
| tree | bf8cee96a707a7bec0ac424fa0d7b04eb6d3caef /src/threading.cpp | |
| parent | 223b66f42264eff24e63667ff9ccf3c2b78358b3 (diff) | |
cover openbsd too
Diffstat (limited to 'src/threading.cpp')
| -rw-r--r-- | src/threading.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/threading.cpp b/src/threading.cpp index cefe0ce8b..c065663b2 100644 --- a/src/threading.cpp +++ b/src/threading.cpp @@ -504,6 +504,40 @@ gb_internal void tpool_wait_on_addr(Futex *addr, Footex val) { } } +#elif defined(GB_SYSTEM_OPENBSD) + +#include <sys/futex.h> + +typedef std::atomic<int32_t> Futex; +typedef volatile int32_t Footex; + +gb_internal void tpool_wake_addr(Futex *addr) { + int ret = futex((volatile uint32_t *)addr, FUTEX_WAKE | FUTEX_PRIVATE_FLAG, 1, NULL, NULL); + if (ret == -1) { + perror("Futex wake"); + GB_PANIC("futex wake fail"); + } +} + +gb_internal void tpool_wait_on_addr(Futex *addr, Footex val) { + for (;;) { + int ret = futex((volatile uint32_t *)addr, FUTEX_WAIT | FUTEX_PRIVATE_FLAG, val, NULL, NULL); + if (ret != -1) { + if (*addr != val) { + return; + } + + } else { + if (errno == ETIMEDOUT || errno == EINTR) { + continue; + } + + perror("Futex wait"); + GB_PANIC("Failed in futex wait!\n"); + } + } +} + #elif defined(GB_SYSTEM_OSX) typedef std::atomic<int64_t> Futex; |