From 2508a0f3deb4d62b53d76734ca70ca294443629f Mon Sep 17 00:00:00 2001 From: Mark Benvenuto Date: Fri, 13 Nov 2015 15:50:56 -0500 Subject: SERVER-21216 Fix FreeBSD & OpenBSD compilation, add stack_locator --- src/mongo/platform/stack_locator_freebsd.cpp | 31 +++++++++++++++++++++- src/mongo/platform/stack_locator_openbsd.cpp | 27 ++++++++++++++++++- .../platform/stack_locator_pthread_getattr_np.cpp | 7 ++--- src/mongo/platform/stack_locator_unknown.cpp | 2 +- src/mongo/util/net/hostname_canonicalization.cpp | 1 + 5 files changed, 62 insertions(+), 6 deletions(-) diff --git a/src/mongo/platform/stack_locator_freebsd.cpp b/src/mongo/platform/stack_locator_freebsd.cpp index af46f763783..f7f06abba25 100644 --- a/src/mongo/platform/stack_locator_freebsd.cpp +++ b/src/mongo/platform/stack_locator_freebsd.cpp @@ -26,4 +26,33 @@ * it in the license file. */ -#include "stack_locator_unknown.cpp" +#include "mongo/platform/basic.h" + +#include "mongo/platform/stack_locator.h" + +#include +#include + +#include "mongo/util/assert_util.h" +#include "mongo/util/scopeguard.h" + +namespace mongo { + +StackLocator::StackLocator() { + pthread_attr_t attr; + size_t size; + + pthread_t self = pthread_self(); + + invariant(pthread_attr_init(&attr) == 0); + ON_BLOCK_EXIT(pthread_attr_destroy, &attr); + + invariant(pthread_attr_get_np(self, &attr) == 0); + + invariant(pthread_attr_getstack(&attr, &_end, &size) == 0); + + // TODO: Assumes stack grows downward on FreeBSD + _begin = static_cast(_end) + size; +} + +} // namespace mongo diff --git a/src/mongo/platform/stack_locator_openbsd.cpp b/src/mongo/platform/stack_locator_openbsd.cpp index af46f763783..014edeaa247 100644 --- a/src/mongo/platform/stack_locator_openbsd.cpp +++ b/src/mongo/platform/stack_locator_openbsd.cpp @@ -26,4 +26,29 @@ * it in the license file. */ -#include "stack_locator_unknown.cpp" +#include "mongo/platform/basic.h" + +#include "mongo/platform/stack_locator.h" + +#include +#include + +#include "mongo/util/assert_util.h" +#include "mongo/util/scopeguard.h" + +namespace mongo { + +StackLocator::StackLocator() { + stack_t stack_info; + + pthread_t self = pthread_self(); + + invariant(pthread_stackseg_np(self, &stack_info) == 0); + + _begin = stack_info.ss_sp; + + // TODO: Assumes stack grows downward on OpenBSD + _end = static_cast(_begin) - stack_info.ss_size; +} + +} // namespace mongo diff --git a/src/mongo/platform/stack_locator_pthread_getattr_np.cpp b/src/mongo/platform/stack_locator_pthread_getattr_np.cpp index 00961d06286..648d26a41cc 100644 --- a/src/mongo/platform/stack_locator_pthread_getattr_np.cpp +++ b/src/mongo/platform/stack_locator_pthread_getattr_np.cpp @@ -33,20 +33,21 @@ #include #include "mongo/util/assert_util.h" +#include "mongo/util/scopeguard.h" namespace mongo { StackLocator::StackLocator() { pthread_t self = pthread_self(); pthread_attr_t selfAttrs; - pthread_attr_init(&selfAttrs); - pthread_getattr_np(self, &selfAttrs); + invariant(pthread_attr_init(&selfAttrs) == 0); + invariant(pthread_getattr_np(self, &selfAttrs) == 0); + ON_BLOCK_EXIT(pthread_attr_destroy, &selfAttrs); void* base = nullptr; size_t size = 0; auto result = pthread_attr_getstack(&selfAttrs, &base, &size); - pthread_attr_destroy(&selfAttrs); invariant(result == 0); invariant(base != nullptr); diff --git a/src/mongo/platform/stack_locator_unknown.cpp b/src/mongo/platform/stack_locator_unknown.cpp index fd3fb62c993..8f5708a20ec 100644 --- a/src/mongo/platform/stack_locator_unknown.cpp +++ b/src/mongo/platform/stack_locator_unknown.cpp @@ -36,4 +36,4 @@ namespace mongo { StackLocator::StackLocator() = default; -// namespace mongo +} // namespace mongo diff --git a/src/mongo/util/net/hostname_canonicalization.cpp b/src/mongo/util/net/hostname_canonicalization.cpp index afeeef45280..e7c0eecdcda 100644 --- a/src/mongo/util/net/hostname_canonicalization.cpp +++ b/src/mongo/util/net/hostname_canonicalization.cpp @@ -34,6 +34,7 @@ #if !defined(_WIN32) #include +#include #include #include #include -- cgit v1.2.1