diff options
author | Christopher Ferris <cferris@google.com> | 2014-05-23 22:23:45 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-05-23 22:23:45 +0000 |
commit | d917d64fafb2eca22c9c75a8527eb4e920a9f079 (patch) | |
tree | d85bfa14bfbd8b26fe591ff3acf637ca8ca259e9 | |
parent | 8814bd1d24e3ce9476e64ba641d592521fcf80ed (diff) | |
parent | e48460762273586744a79d146c2916bcfca7e9e4 (diff) | |
download | core-d917d64fafb2eca22c9c75a8527eb4e920a9f079.tar.gz |
Merge "Only copy mcontext data from sigcontext."
-rw-r--r-- | libbacktrace/BacktraceThread.cpp | 8 | ||||
-rw-r--r-- | libbacktrace/BacktraceThread.h | 6 |
2 files changed, 9 insertions, 5 deletions
diff --git a/libbacktrace/BacktraceThread.cpp b/libbacktrace/BacktraceThread.cpp index 018d51f04..b47cd2ad2 100644 --- a/libbacktrace/BacktraceThread.cpp +++ b/libbacktrace/BacktraceThread.cpp @@ -117,6 +117,12 @@ void ThreadEntry::Wake() { futex(&futex_, FUTEX_WAKE, INT_MAX, NULL, NULL, 0); } +void ThreadEntry::CopyUcontextFromSigcontext(void* sigcontext) { + ucontext_t* ucontext = reinterpret_cast<ucontext_t*>(sigcontext); + // The only thing the unwinder cares about is the mcontext data. + memcpy(&ucontext_.uc_mcontext, &ucontext->uc_mcontext, sizeof(ucontext->uc_mcontext)); +} + //------------------------------------------------------------------------- // BacktraceThread functions. //------------------------------------------------------------------------- @@ -129,7 +135,7 @@ static void SignalHandler(int, siginfo_t*, void* sigcontext) { return; } - entry->CopyUcontext(reinterpret_cast<ucontext_t*>(sigcontext)); + entry->CopyUcontextFromSigcontext(sigcontext); // Indicate the ucontext is now valid. entry->Wake(); diff --git a/libbacktrace/BacktraceThread.h b/libbacktrace/BacktraceThread.h index a75a807be..ff3e9f3f4 100644 --- a/libbacktrace/BacktraceThread.h +++ b/libbacktrace/BacktraceThread.h @@ -40,14 +40,12 @@ public: static void Remove(ThreadEntry* entry); - inline void CopyUcontext(ucontext_t* ucontext) { - memcpy(&ucontext_, ucontext, sizeof(ucontext_)); - } - void Wake(); void Wait(int); + void CopyUcontextFromSigcontext(void*); + inline void Lock() { pthread_mutex_lock(&mutex_); // Reset the futex value in case of multiple unwinds of the same thread. |