1818#ifdef BRPC_BTHREAD_TRACER
1919
2020#include " bthread/task_tracer.h"
21- #include < unistd.h>
22- #include < poll.h>
23- #include < gflags/gflags.h>
24- #include < absl/debugging/stacktrace.h>
25- #include < absl/debugging/symbolize.h>
26- #include " butil/debug/stack_trace.h"
21+ #include " bthread/processor.h"
22+ #include " bthread/task_group.h"
23+ #include " butil/fd_utility.h"
2724#include " butil/memory/scope_guard.h"
2825#include " butil/reloadable_flags.h"
29- #include " butil/fd_utility.h"
30- #include " bthread/task_group.h"
31- #include " bthread/processor.h"
26+ #include < absl/debugging/stacktrace.h>
27+ #include < absl/debugging/symbolize.h>
28+ #include < csignal>
29+ #include < gflags/gflags.h>
30+ #include < poll.h>
31+ #include < pthread.h>
32+ #include < unistd.h>
3233
3334namespace bthread {
3435
@@ -151,7 +152,7 @@ void TaskTracer::set_status(TaskStatus s, TaskMeta* m) {
151152 m->status = s;
152153 }
153154 if (TASK_STATUS_CREATED == s) {
154- m->worker_tid = - 1 ;
155+ m->worker_tid = pthread_t {} ;
155156 }
156157 }
157158
@@ -161,7 +162,7 @@ void TaskTracer::set_status(TaskStatus s, TaskMeta* m) {
161162 }
162163}
163164
164- void TaskTracer::set_running_status (pid_t worker_tid, TaskMeta* m) {
165+ void TaskTracer::set_running_status (pthread_t worker_tid, TaskMeta* m) {
165166 BAIDU_SCOPED_LOCK (m->version_lock );
166167 m->worker_tid = worker_tid;
167168 m->status = TASK_STATUS_RUNNING;
@@ -230,7 +231,7 @@ TaskTracer::Result TaskTracer::TraceImpl(bthread_t tid) {
230231
231232 BAIDU_SCOPED_LOCK (_mutex);
232233 TaskStatus status;
233- pid_t worker_tid;
234+ pthread_t worker_tid;
234235 const uint32_t given_version = get_version (tid);
235236 {
236237 BAIDU_SCOPED_LOCK (m->version_lock );
@@ -368,7 +369,7 @@ void TaskTracer::SignalHandler(int, siginfo_t* info, void* context) {
368369 butil::ignore_result (write (signal_sync->pipe_fds [1 ], " 1" , 1 ));
369370}
370371
371- TaskTracer::Result TaskTracer::SignalTrace (pid_t tid ) {
372+ TaskTracer::Result TaskTracer::SignalTrace (pthread_t worker_tid ) {
372373 // CAUTION:
373374 // https://github.com/gperftools/gperftools/wiki/gperftools'-stacktrace-capturing-methods-and-their-issues#libunwind
374375 // Generally, libunwind promises async-signal-safety for capturing backtraces.
@@ -403,6 +404,10 @@ TaskTracer::Result TaskTracer::SignalTrace(pid_t tid) {
403404 //
404405 // Therefore, use async-signal-safe absl::DefaultStackUnwinder instead of libunwind.
405406
407+ if (pthread_equal (worker_tid, pthread_self ())) {
408+ return Result::MakeErrorResult (" Forbid to trace self" );
409+ }
410+
406411 // Remove unused SignalSyncs.
407412 auto iter = std::remove_if (
408413 _inuse_signal_syncs.begin (), _inuse_signal_syncs.end (),
@@ -424,11 +429,11 @@ TaskTracer::Result TaskTracer::SignalTrace(pid_t tid) {
424429 sigval value{};
425430 value.sival_ptr = signal_sync.get ();
426431 size_t sigqueue_try = 0 ;
427- while (sigqueue (tid , SIGURG, value) != 0 ) {
432+ while (pthread_sigqueue (worker_tid , SIGURG, value) != 0 ) {
428433 if (errno != EAGAIN || sigqueue_try++ >= 3 ) {
429434 // Remove reference for SignalHandler.
430435 signal_sync->RemoveRefManually ();
431- return Result::MakeErrorResult (" Fail to sigqueue : %s, tid: %d " , berror (), tid );
436+ return Result::MakeErrorResult (" Fail to pthread_sigqueue : %s" , berror ());
432437 }
433438 }
434439 _inuse_signal_syncs.push_back (signal_sync);
0 commit comments