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
|
--- base/profiler/stack_copier_signal.cc.orig 2021-05-12 22:05:40 UTC
+++ base/profiler/stack_copier_signal.cc
@@ -4,7 +4,14 @@
#include "base/profiler/stack_copier_signal.h"
+#if defined(OS_LINUX)
#include <linux/futex.h>
+#include <syscall.h>
+#elif defined(OS_FREEBSD)
+#include <sys/types.h>
+#include <sys/thr.h>
+#include <sys/umtx.h>
+#endif
#include <signal.h>
#include <sys/ucontext.h>
#include <syscall.h>
@@ -36,8 +43,13 @@ class AsyncSafeWaitableEvent {
// for a pthread mutex. So, also check the condition.
while (true) {
int res =
+#if defined(OS_LINUX)
syscall(SYS_futex, futex_int_ptr(), FUTEX_WAIT | FUTEX_PRIVATE_FLAG,
0, nullptr, nullptr, 0);
+#elif defined(OS_FREEBSD)
+ _umtx_op(futex_int_ptr(), UMTX_OP_WAIT_UINT_PRIVATE, 0, nullptr,
+ nullptr);
+#endif
if (futex_.load(std::memory_order_acquire) != 0)
return true;
if (res != 0)
@@ -47,8 +59,12 @@ class AsyncSafeWaitableEvent {
void Signal() {
futex_.store(1, std::memory_order_release);
+#if defined(OS_LINUX)
syscall(SYS_futex, futex_int_ptr(), FUTEX_WAKE | FUTEX_PRIVATE_FLAG, 1,
nullptr, nullptr, 0);
+#elif defined(OS_FREEBSD)
+ _umtx_op(futex_int_ptr(), UMTX_OP_WAKE_PRIVATE, 1, nullptr, nullptr);
+#endif
}
private:
@@ -222,11 +238,18 @@ bool StackCopierSignal::CopyStack(StackBuffer* stack_b
if (!scoped_sigaction.succeeded())
return false;
+#if defined(OS_LINUX)
if (syscall(SYS_tgkill, getpid(), thread_delegate_->GetThreadId(),
SIGURG) != 0) {
NOTREACHED();
return false;
}
+#elif defined(OS_FREEBSD)
+ if (thr_kill2(getpid(), thread_delegate_->GetThreadId(), SIGURG) != 0) {
+ NOTREACHED();
+ return false;
+ }
+#endif
bool finished_waiting = wait_event.Wait();
TRACE_EVENT_END0(TRACE_DISABLED_BY_DEFAULT("cpu_profiler.debug"),
"StackCopierSignal copy stack");
|