mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-05 23:28:48 +00:00
Merge pull request #4103 from laytan/wait-shared-on-macos-10-15
UL_COMPARE_AND_WAIT_SHARED is macOS 10.15+
This commit is contained in:
+27
-3
@@ -839,8 +839,16 @@ gb_internal void futex_signal(Futex *f) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
#endif
|
#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 (;;) {
|
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) {
|
if (ret >= 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -875,9 +883,17 @@ gb_internal void futex_broadcast(Futex *f) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
#endif
|
#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 (;;) {
|
for (;;) {
|
||||||
enum { ULF_WAKE_ALL = 0x00000100 };
|
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) {
|
if (ret == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -915,8 +931,16 @@ gb_internal void futex_wait(Futex *f, Footex val) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
#endif
|
#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 (;;) {
|
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 (ret >= 0) {
|
||||||
if (*f != val) {
|
if (*f != val) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
Reference in New Issue
Block a user