1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
--- swift-corelibs-libdispatch/src/shims/lock.c.orig 2023-06-15 00:55:45 UTC
+++ swift-corelibs-libdispatch/src/shims/lock.c
@@ -19,6 +19,10 @@
*/
#include "internal.h"
+#if defined(__FreeBSD__)
+#include <sys/types.h>
+#include <sys/umtx.h>
+#endif
#if TARGET_OS_MAC
dispatch_static_assert(DLOCK_LOCK_DATA_CONTENTION ==
@@ -516,6 +520,27 @@ _dispatch_wait_on_address(uint32_t volatile *_address,
? INFINITE : ((nsecs + 1000000) / 1000000);
if (dwMilliseconds == 0) return ETIMEDOUT;
return WaitOnAddress(address, &value, sizeof(value), dwMilliseconds) == TRUE;
+#elif defined(__FreeBSD__)
+ (void)flags;
+ if (nsecs == DISPATCH_TIME_FOREVER) {
+ _umtx_op(address, UMTX_OP_WAIT_UINT, value, NULL, NULL);
+ return 0;
+ } else {
+ struct timespec tstimeout;
+ tstimeout.tv_sec = nsecs / NSEC_PER_SEC;
+ tstimeout.tv_nsec = (long)(nsecs % NSEC_PER_SEC);
+
+ int r = _umtx_op(address, UMTX_OP_WAIT_UINT, value, (void *)(uintptr_t)sizeof(struct timespec), &tstimeout);
+ if (r == -1) {
+ if (errno == ETIMEDOUT) {
+ return ETIMEDOUT;
+ } else {
+ return 0;
+ }
+ } else {
+ return 0;
+ }
+ }
#else
#error _dispatch_wait_on_address unimplemented for this platform
#endif
@@ -530,6 +555,8 @@ _dispatch_wake_by_address(uint32_t volatile *address)
_dispatch_futex_wake((uint32_t *)address, INT_MAX, FUTEX_PRIVATE_FLAG);
#elif defined(_WIN32)
WakeByAddressAll((uint32_t *)address);
+#elif defined(__FreeBSD__)
+ _umtx_op((uint32_t *)address, UMTX_OP_WAKE, INT_MAX, NULL, NULL);
#else
(void)address;
#endif
@@ -627,7 +654,9 @@ _dispatch_unfair_lock_lock_slow(dispatch_unfair_lock_t
if (unlikely(_dispatch_lock_is_locked_by(cur, self))) {
DISPATCH_CLIENT_CRASH(0, "trying to lock recursively");
}
- _dispatch_thread_switch(cur, flags, timeout++);
+ //_dispatch_thread_switch(cur, flags, timeout++);
+ (void)timeout;
+ (void)flags;
}
}
#endif
@@ -689,7 +718,7 @@ _dispatch_once_wait(dispatch_once_gate_t dgo)
_dispatch_futex_wait(lock, (dispatch_lock)new_v, NULL,
FUTEX_PRIVATE_FLAG);
#else
- _dispatch_thread_switch(new_v, 0, timeout++);
+ //_dispatch_thread_switch(new_v, 0, timeout++);
#endif
(void)timeout;
}
|