summaryrefslogtreecommitdiffstats
path: root/vespalib
diff options
context:
space:
mode:
authorTor Brede Vekterli <vekterli@yahooinc.com>2022-06-01 09:39:05 +0000
committerTor Brede Vekterli <vekterli@yahooinc.com>2022-06-01 09:39:05 +0000
commitb87ccafda60ca64985290199d36ec8415824a12f (patch)
tree37d95b42a8d88590ddb829a2c90a4209c6f0e9ce /vespalib
parent1d7f23b7ffa7ffa074acab88257213a63b1c2700 (diff)
Use compare_exchange to check and un-set pending signal handler
Diffstat (limited to 'vespalib')
-rw-r--r--vespalib/src/vespa/vespalib/util/signalhandler.cpp7
1 files changed, 4 insertions, 3 deletions
diff --git a/vespalib/src/vespa/vespalib/util/signalhandler.cpp b/vespalib/src/vespa/vespalib/util/signalhandler.cpp
index c4d61738324..fe74267d4be 100644
--- a/vespalib/src/vespa/vespalib/util/signalhandler.cpp
+++ b/vespalib/src/vespa/vespalib/util/signalhandler.cpp
@@ -197,15 +197,16 @@ SignalHandler::get_cross_thread_stack_trace(pthread_t thread_id)
std::lock_guard guard(stack_dump_caller_mutex);
assert(!_shared_backtrace_data._want_backtrace.load());
- _shared_backtrace_data._signal_handler_done.store(false);
-
_shared_backtrace_data._want_backtrace.store(true);
+
if (pthread_kill(thread_id, SIGUSR2) != 0) {
_shared_backtrace_data._want_backtrace.store(false);
return "(pthread_kill() failed; could not get backtrace)";
}
- while (!_shared_backtrace_data._signal_handler_done.load()) {
+ bool expected_done = true;
+ while (!_shared_backtrace_data._signal_handler_done.compare_exchange_strong(expected_done, false)) {
std::this_thread::sleep_for(1ms); // TODO yield instead?
+ expected_done = true;
}
constexpr int frames_to_skip = 4; // handleSignal() -> gotSignal() -> dump_current_thread_...() -> backtrace()
return vespalib::getStackTrace(frames_to_skip, _shared_backtrace_data._stack_frames.data(),