summaryrefslogtreecommitdiff
path: root/src/mongo/util/stacktrace_test.cpp
diff options
context:
space:
mode:
authorGabriel Russell <gabriel.russell@mongodb.com>2020-11-18 14:22:26 -0500
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-11-23 16:02:49 +0000
commit71fb74aab300a852761e0ae3b0782c207f4aef52 (patch)
tree0fe6378967d350af497efdf7811b07de41a5cb18 /src/mongo/util/stacktrace_test.cpp
parentf39eb409f4f3e32b3d77b4b05bb977113c52f48c (diff)
downloadmongo-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.cpp32
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