aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLaytan <laytanlaats@hotmail.com>2024-08-18 19:38:52 +0200
committerGitHub <noreply@github.com>2024-08-18 19:38:52 +0200
commitbb3f848b4a8affb37c42bdb9e50a5cafb6db3971 (patch)
tree86e21d86beea217f0aba9c116251e1f01c15c49d /src
parenta51b9c6fb019f3d1e9c22e26ff1a54f7a9e8d629 (diff)
parentb7b3ada3b1bce95d0add13acb8b8192437bad83b (diff)
Merge pull request #4103 from laytan/wait-shared-on-macos-10-15
UL_COMPARE_AND_WAIT_SHARED is macOS 10.15+
Diffstat (limited to 'src')
-rw-r--r--src/threading.cpp30
1 files changed, 27 insertions, 3 deletions
diff --git a/src/threading.cpp b/src/threading.cpp
index 011b66028..e30a20a06 100644
--- a/src/threading.cpp
+++ b/src/threading.cpp
@@ -839,8 +839,16 @@ gb_internal void futex_signal(Futex *f) {
}
} else {
#endif
+ // UL_COMPARE_AND_WAIT_SHARED is only available on macOS 10.15+
+ int WAIT_FLAG;
+ if (__builtin_available(macOS 10.15, *)) {
+ WAIT_FLAG = UL_COMPARE_AND_WAIT_SHARED;
+ } else {
+ WAIT_FLAG = UL_COMPARE_AND_WAIT;
+ }
+
for (;;) {
- int ret = __ulock_wake(UL_COMPARE_AND_WAIT_SHARED | ULF_NO_ERRNO, f, 0);
+ int ret = __ulock_wake(WAIT_FLAG | ULF_NO_ERRNO, f, 0);
if (ret >= 0) {
return;
}
@@ -875,9 +883,17 @@ gb_internal void futex_broadcast(Futex *f) {
}
} else {
#endif
+ // UL_COMPARE_AND_WAIT_SHARED is only available on macOS 10.15+
+ int WAIT_FLAG;
+ if (__builtin_available(macOS 10.15, *)) {
+ WAIT_FLAG = UL_COMPARE_AND_WAIT_SHARED;
+ } else {
+ WAIT_FLAG = UL_COMPARE_AND_WAIT;
+ }
+
for (;;) {
enum { ULF_WAKE_ALL = 0x00000100 };
- int ret = __ulock_wake(UL_COMPARE_AND_WAIT_SHARED | ULF_NO_ERRNO | ULF_WAKE_ALL, f, 0);
+ int ret = __ulock_wake(WAIT_FLAG | ULF_NO_ERRNO | ULF_WAKE_ALL, f, 0);
if (ret == 0) {
return;
}
@@ -915,8 +931,16 @@ gb_internal void futex_wait(Futex *f, Footex val) {
}
} else {
#endif
+ // UL_COMPARE_AND_WAIT_SHARED is only available on macOS 10.15+
+ int WAIT_FLAG;
+ if (__builtin_available(macOS 10.15, *)) {
+ WAIT_FLAG = UL_COMPARE_AND_WAIT_SHARED;
+ } else {
+ WAIT_FLAG = UL_COMPARE_AND_WAIT;
+ }
+
for (;;) {
- int ret = __ulock_wait(UL_COMPARE_AND_WAIT_SHARED | ULF_NO_ERRNO, f, val, 0);
+ int ret = __ulock_wait(WAIT_FLAG | ULF_NO_ERRNO, f, val, 0);
if (ret >= 0) {
if (*f != val) {
return;