diff options
author | Gabriel Russell <gabriel.russell@mongodb.com> | 2020-11-18 14:22:26 -0500 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-11-23 16:02:49 +0000 |
commit | 71fb74aab300a852761e0ae3b0782c207f4aef52 (patch) | |
tree | 0fe6378967d350af497efdf7811b07de41a5cb18 /src/mongo/util/stacktrace_test.cpp | |
parent | f39eb409f4f3e32b3d77b4b05bb977113c52f48c (diff) | |
download | mongo-71fb74aab300a852761e0ae3b0782c207f4aef52.tar.gz |
SERVER-48696 sigaction actions need to all be extern "C"
Diffstat (limited to 'src/mongo/util/stacktrace_test.cpp')
-rw-r--r-- | src/mongo/util/stacktrace_test.cpp | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/src/mongo/util/stacktrace_test.cpp b/src/mongo/util/stacktrace_test.cpp index 9bf6dd99a19..cb06e5e8ef8 100644 --- a/src/mongo/util/stacktrace_test.cpp +++ b/src/mongo/util/stacktrace_test.cpp @@ -377,6 +377,8 @@ TEST(StackTrace, MetadataGeneratorFunctionMeasure) { #endif // _WIN32 #ifdef HAVE_SIGALTSTACK +extern "C" typedef void(sigAction_t)(int signum, siginfo_t* info, void* context); + class StackTraceSigAltStackTest : public unittest::Test { public: using unittest::Test::Test; @@ -398,7 +400,7 @@ public: 23388, "Local var", "var"_attr = "{:X}"_format(reinterpret_cast<uintptr_t>(&storage))); } - static void tryHandler(void (*handler)(int, siginfo_t*, void*)) { + static void tryHandler(sigAction_t* handler) { constexpr int sig = SIGUSR1; constexpr size_t kStackSize = size_t{1} << 20; // 1 MiB auto buf = std::make_unique<std::array<unsigned char, kStackSize>>(); @@ -447,23 +449,31 @@ public: } }; +extern "C" void stackTraceSigAltStackMinimalAction(int sig, siginfo_t*, void*) { + StackTraceSigAltStackTest::handlerPreamble(sig); +} + TEST_F(StackTraceSigAltStackTest, Minimal) { - tryHandler([](int sig, siginfo_t*, void*) { handlerPreamble(sig); }); + StackTraceSigAltStackTest::tryHandler(stackTraceSigAltStackMinimalAction); +} + +extern "C" void stackTraceSigAltStackPrintAction(int sig, siginfo_t*, void*) { + StackTraceSigAltStackTest::handlerPreamble(sig); + printStackTrace(); } TEST_F(StackTraceSigAltStackTest, Print) { - tryHandler([](int sig, siginfo_t*, void*) { - handlerPreamble(sig); - printStackTrace(); - }); + StackTraceSigAltStackTest::tryHandler(&stackTraceSigAltStackPrintAction); +} + +extern "C" void stackTraceSigAltStackBacktraceAction(int sig, siginfo_t*, void*) { + StackTraceSigAltStackTest::handlerPreamble(sig); + std::array<void*, kStackTraceFrameMax> addrs; + rawBacktrace(addrs.data(), addrs.size()); } TEST_F(StackTraceSigAltStackTest, Backtrace) { - tryHandler([](int sig, siginfo_t*, void*) { - handlerPreamble(sig); - std::array<void*, kStackTraceFrameMax> addrs; - rawBacktrace(addrs.data(), addrs.size()); - }); + StackTraceSigAltStackTest::tryHandler(stackTraceSigAltStackBacktraceAction); } #endif // HAVE_SIGALTSTACK |