This is an automated email from the ASF dual-hosted git repository.

guangmingchen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brpc.git


The following commit(s) were added to refs/heads/master by this push:
     new 9934c39b feat: make bthread stack trace signal number configurable 
(#3124)
9934c39b is described below

commit 9934c39be00806669741eebba38f6ca32ba11956
Author: Regal <[email protected]>
AuthorDate: Wed Nov 5 10:53:20 2025 +0800

    feat: make bthread stack trace signal number configurable (#3124)
---
 src/bthread/task_control.cpp           |  3 +--
 src/bthread/task_tracer.cpp            | 12 +++++++++---
 src/bthread/task_tracer.h              |  6 +++++-
 test/brpc_builtin_service_unittest.cpp | 10 ++++++++++
 4 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/src/bthread/task_control.cpp b/src/bthread/task_control.cpp
index 99e4af50..ba067e39 100644
--- a/src/bthread/task_control.cpp
+++ b/src/bthread/task_control.cpp
@@ -426,8 +426,7 @@ void TaskControl::stop_and_join() {
     for (auto worker: _workers) {
         // Interrupt blocking operations.
 #ifdef BRPC_BTHREAD_TRACER
-        // TaskTracer has registered signal handler for SIGURG.
-        pthread_kill(worker, SIGURG);
+        pthread_kill(worker, _task_tracer.get_trace_signal());
 #else
         interrupt_pthread(worker);
 #endif // BRPC_BTHREAD_TRACER
diff --git a/src/bthread/task_tracer.cpp b/src/bthread/task_tracer.cpp
index 0ae782e9..b550c03a 100644
--- a/src/bthread/task_tracer.cpp
+++ b/src/bthread/task_tracer.cpp
@@ -35,6 +35,10 @@ namespace bthread {
 
 DEFINE_uint32(signal_trace_timeout_ms, 50, "Timeout for signal trace in ms");
 BUTIL_VALIDATE_GFLAG(signal_trace_timeout_ms, 
butil::PositiveInteger<uint32_t>);
+// Note that SIGURG handler may be registered by some library such as cgo
+// so let the signal number be configurable
+DEFINE_int32(signal_number_for_trace, SIGURG,
+             "signal number used for stack trace, default to SIGURG");
 
 extern BAIDU_THREAD_LOCAL TaskMeta* pthread_fake_meta;
 
@@ -315,17 +319,19 @@ TaskTracer::Result 
TaskTracer::TraceByLibunwind(unw_cursor_t& cursor) {
 
 bool TaskTracer::RegisterSignalHandler() {
     // Set up the signal handler.
+    _signal_num = FLAGS_signal_number_for_trace;
     struct sigaction old_sa{};
     struct sigaction sa{};
     sa.sa_sigaction = SignalHandler;
     sa.sa_flags = SA_SIGINFO;
     sigfillset(&sa.sa_mask);
-    if (sigaction(SIGURG, &sa, &old_sa) != 0) {
+    if (sigaction(_signal_num, &sa, &old_sa) != 0) {
         PLOG(ERROR) << "Failed to sigaction";
         return false;
     }
     if (NULL != old_sa.sa_handler || NULL != old_sa.sa_sigaction) {
-        LOG(ERROR) << "Signal handler of SIGURG is already registered";
+        LOG(ERROR) << "Signal handler of signal number "
+                   << _signal_num << " is already registered";
         return false;
     }
 
@@ -403,7 +409,7 @@ TaskTracer::Result TaskTracer::SignalTrace(pthread_t 
worker_tid) {
     sigval value{};
     value.sival_ptr = signal_sync.get();
     size_t sigqueue_try = 0;
-    while (pthread_sigqueue(worker_tid, SIGURG, value) != 0) {
+    while (pthread_sigqueue(worker_tid, _signal_num, value) != 0) {
         if (errno != EAGAIN || sigqueue_try++ >= 3) {
             // Remove reference for SignalHandler.
             signal_sync->RemoveRefManually();
diff --git a/src/bthread/task_tracer.h b/src/bthread/task_tracer.h
index be95f3ac..8844413a 100644
--- a/src/bthread/task_tracer.h
+++ b/src/bthread/task_tracer.h
@@ -49,6 +49,9 @@ public:
     // When the worker is jumping stack from a bthread to another,
     static void WaitForTracing(TaskMeta* m);
 
+    int get_trace_signal() const {
+        return _signal_num;
+    }
 private:
     // Error number guard used in signal handler.
     class ErrnoGuard {
@@ -100,7 +103,7 @@ private:
     Result ContextTrace(bthread_fcontext_t fcontext);
     static Result TraceByLibunwind(unw_cursor_t& cursor);
 
-    static bool RegisterSignalHandler();
+    bool RegisterSignalHandler();
     static void SignalHandler(int sig, siginfo_t* info, void* context);
     Result SignalTrace(pthread_t worker_tid);
 
@@ -115,6 +118,7 @@ private:
     std::vector<butil::intrusive_ptr<SignalSync>> _inuse_signal_syncs;
 
     bvar::LatencyRecorder _trace_time{"bthread_trace_time"};
+    int _signal_num{SIGURG};
 };
 
 } // namespace bthread
diff --git a/test/brpc_builtin_service_unittest.cpp 
b/test/brpc_builtin_service_unittest.cpp
index 4ba8a039..da4d6f10 100644
--- a/test/brpc_builtin_service_unittest.cpp
+++ b/test/brpc_builtin_service_unittest.cpp
@@ -66,9 +66,19 @@ DECLARE_bool(rpcz_hex_log_id);
 DECLARE_int32(idle_timeout_second);
 } // namespace rpc
 
+#ifdef BRPC_BTHREAD_TRACER
+namespace bthread {
+DECLARE_int32(signal_number_for_trace);
+}
+#endif
+
 int main(int argc, char* argv[]) {
     brpc::FLAGS_idle_timeout_second = 0;
     testing::InitGoogleTest(&argc, argv);
+#ifdef BRPC_BTHREAD_TRACER
+    // test using signal number other than SIGURG
+    bthread::FLAGS_signal_number_for_trace = SIGUSR2;
+#endif
     return RUN_ALL_TESTS();
 }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to