diff options
author | Tor Brede Vekterli <vekterli@yahooinc.com> | 2022-06-01 09:39:05 +0000 |
---|---|---|
committer | Tor Brede Vekterli <vekterli@yahooinc.com> | 2022-06-01 09:39:05 +0000 |
commit | b87ccafda60ca64985290199d36ec8415824a12f (patch) | |
tree | 37d95b42a8d88590ddb829a2c90a4209c6f0e9ce /vespalib | |
parent | 1d7f23b7ffa7ffa074acab88257213a63b1c2700 (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.cpp | 7 |
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(), |