Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(65)

Unified Diff: base/debug/stack_trace.cc

Issue 2707973004: mac: Implement GetStackEnd(). (Closed)
Patch Set: Fix compile error. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/debug/stack_trace.h ('k') | base/debug/stack_trace_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/debug/stack_trace.cc
diff --git a/base/debug/stack_trace.cc b/base/debug/stack_trace.cc
index 94ff7d0755ab50a650ebcee9dfbe05ab287972b2..af4a6efc3ed2f60f3b7a04b2f592e9e886726dfc 100644
--- a/base/debug/stack_trace.cc
+++ b/base/debug/stack_trace.cc
@@ -20,6 +20,10 @@
#include "base/threading/platform_thread.h"
#endif
+#if defined(OS_MACOSX)
+#include <pthread.h>
+#endif
+
#if defined(OS_LINUX) && defined(__GLIBC__)
extern "C" void* __libc_stack_end;
#endif
@@ -42,56 +46,6 @@ constexpr size_t kStackFrameAdjustment = sizeof(uintptr_t);
constexpr size_t kStackFrameAdjustment = 0;
#endif
-// Returns end of the stack, or 0 if we couldn't get it.
-uintptr_t GetStackEnd() {
-#if defined(OS_ANDROID)
- // Bionic reads proc/maps on every call to pthread_getattr_np() when called
- // from the main thread. So we need to cache end of stack in that case to get
- // acceptable performance.
- // For all other threads pthread_getattr_np() is fast enough as it just reads
- // values from its pthread_t argument.
- static uintptr_t main_stack_end = 0;
-
- bool is_main_thread = GetCurrentProcId() == PlatformThread::CurrentId();
- if (is_main_thread && main_stack_end) {
- return main_stack_end;
- }
-
- uintptr_t stack_begin = 0;
- size_t stack_size = 0;
- pthread_attr_t attributes;
- int error = pthread_getattr_np(pthread_self(), &attributes);
- if (!error) {
- error = pthread_attr_getstack(
- &attributes,
- reinterpret_cast<void**>(&stack_begin),
- &stack_size);
- pthread_attr_destroy(&attributes);
- }
- DCHECK(!error);
-
- uintptr_t stack_end = stack_begin + stack_size;
- if (is_main_thread) {
- main_stack_end = stack_end;
- }
- return stack_end; // 0 in case of error
-
-#elif defined(OS_LINUX) && defined(__GLIBC__)
-
- if (GetCurrentProcId() == PlatformThread::CurrentId()) {
- // For the main thread we have a shortcut.
- return reinterpret_cast<uintptr_t>(__libc_stack_end);
- }
-
- // No easy way to get end of the stack for non-main threads,
- // see crbug.com/617730.
-
-#endif
-
- // Don't know how to get end of the stack.
- return 0;
-}
-
uintptr_t GetNextStackFrame(uintptr_t fp) {
return reinterpret_cast<const uintptr_t*>(fp)[0] - kStackFrameAdjustment;
}
@@ -192,6 +146,56 @@ void* LinkStackFrames(void* fpp, void* parent_fp) {
} // namespace
+#if HAVE_TRACE_STACK_FRAME_POINTERS
+uintptr_t GetStackEnd() {
+#if defined(OS_ANDROID)
+ // Bionic reads proc/maps on every call to pthread_getattr_np() when called
+ // from the main thread. So we need to cache end of stack in that case to get
+ // acceptable performance.
+ // For all other threads pthread_getattr_np() is fast enough as it just reads
+ // values from its pthread_t argument.
+ static uintptr_t main_stack_end = 0;
+
+ bool is_main_thread = GetCurrentProcId() == PlatformThread::CurrentId();
+ if (is_main_thread && main_stack_end) {
+ return main_stack_end;
+ }
+
+ uintptr_t stack_begin = 0;
+ size_t stack_size = 0;
+ pthread_attr_t attributes;
+ int error = pthread_getattr_np(pthread_self(), &attributes);
+ if (!error) {
+ error = pthread_attr_getstack(
+ &attributes, reinterpret_cast<void**>(&stack_begin), &stack_size);
+ pthread_attr_destroy(&attributes);
+ }
+ DCHECK(!error);
+
+ uintptr_t stack_end = stack_begin + stack_size;
+ if (is_main_thread) {
+ main_stack_end = stack_end;
+ }
+ return stack_end; // 0 in case of error
+
+#elif defined(OS_LINUX) && defined(__GLIBC__)
+
+ if (GetCurrentProcId() == PlatformThread::CurrentId()) {
+ // For the main thread we have a shortcut.
+ return reinterpret_cast<uintptr_t>(__libc_stack_end);
+ }
+
+// No easy way to get end of the stack for non-main threads,
+// see crbug.com/617730.
+#elif defined(OS_MACOSX)
+ return reinterpret_cast<uintptr_t>(pthread_get_stackaddr_np(pthread_self()));
+#endif
+
+ // Don't know how to get end of the stack.
+ return 0;
+}
+#endif // HAVE_TRACE_STACK_FRAME_POINTERS
+
StackTrace::StackTrace() : StackTrace(arraysize(trace_)) {}
StackTrace::StackTrace(const void* const* trace, size_t count) {
« no previous file with comments | « base/debug/stack_trace.h ('k') | base/debug/stack_trace_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698