From 5dd5bda2343a11f3a96a5818e24239c6016e518f Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Fri, 19 Mar 2004 09:25:45 +0000 Subject: [PATCH] remove GetThreadBacktraceContext; GetBacktrace( x, NULL ) gets the current backtrace --- stepmania/src/archutils/Unix/Backtrace.cpp | 28 ++++++------------- stepmania/src/archutils/Unix/Backtrace.h | 5 ++-- stepmania/src/archutils/Unix/CrashHandler.cpp | 6 ++-- .../src/archutils/Unix/CrashHandlerInternal.h | 1 + .../src/archutils/Unix/LinuxThreadHelpers.cpp | 8 +++--- 5 files changed, 20 insertions(+), 28 deletions(-) diff --git a/stepmania/src/archutils/Unix/Backtrace.cpp b/stepmania/src/archutils/Unix/Backtrace.cpp index 66011e6927..176855222d 100644 --- a/stepmania/src/archutils/Unix/Backtrace.cpp +++ b/stepmania/src/archutils/Unix/Backtrace.cpp @@ -22,7 +22,7 @@ void GetSignalBacktraceContext( BacktraceContext *ctx, const ucontext_t *uc ) ctx->pid = GetCurrentThreadId(); } -void GetCurrentBacktraceContext( BacktraceContext *ctx ) +static void GetCurrentBacktraceContext( BacktraceContext *ctx ) { register void *esp __asm__ ("esp"); ctx->esp = (long) esp; @@ -30,18 +30,6 @@ void GetCurrentBacktraceContext( BacktraceContext *ctx ) ctx->ebp = (long) __builtin_frame_address(0); } -int GetThreadBacktraceContext( int ThreadID, BacktraceContext *ctx ) -{ - ctx->pid = ThreadID; - - if( ThreadID != GetCurrentThreadId() ) - return GetThreadContext( ThreadID, ctx ); - - GetCurrentBacktraceContext( ctx ); - - return 0; -} - static const char *itoa(unsigned n) { static char ret[32]; @@ -293,16 +281,18 @@ void GetExceptionBacktraceContext( BacktraceContext *ctx, const ExceptionInforma ctx->FramePtr = (void *) exception->registerImage->R1.lo; } -void GetCurrentBacktraceContext( BacktraceContext *ctx ) -{ - ctx->FramePtr = __builtin_return_address(2); -} - void InitializeBacktrace() { } void GetBacktrace( const void **buf, size_t size, const BacktraceContext *ctx ) { - Frame *frame = (Frame *) ctx->FramePtr; + BacktraceContext CurrentCtx; + if( ctx == NULL ) + { + ctx = &CurrentCtx; + CurrentCtx.FramePtr = (void *) __builtin_frame_address(0); + } + + const Frame *frame = (Frame *) ctx->FramePtr; unsigned i = 0; while( frame && i < size-1 ) // -1 for NULL diff --git a/stepmania/src/archutils/Unix/Backtrace.h b/stepmania/src/archutils/Unix/Backtrace.h index 68bc4b6dc5..0b70bbd6c5 100644 --- a/stepmania/src/archutils/Unix/Backtrace.h +++ b/stepmania/src/archutils/Unix/Backtrace.h @@ -28,9 +28,8 @@ void InitializeBacktrace(); void GetBacktrace( const void **buf, size_t size, const BacktraceContext *ctx = NULL ); /* Set up a BacktraceContext to get a backtrace for a thread. ThreadID may - * be the current thread. */ -int GetThreadBacktraceContext( int ThreadID, BacktraceContext *ctx ); -void GetCurrentBacktraceContext( BacktraceContext *ctx ); + * not be the current thread. */ +bool GetThreadBacktraceContext( int ThreadID, BacktraceContext *ctx ); /* Set up a BacktraceContext to get a backtrace after receiving a signal, given * a ucontext_t (see sigaction(2)). (This interface is UNIX-specific.) */ diff --git a/stepmania/src/archutils/Unix/CrashHandler.cpp b/stepmania/src/archutils/Unix/CrashHandler.cpp index 914aaece99..c5d7eb5671 100644 --- a/stepmania/src/archutils/Unix/CrashHandler.cpp +++ b/stepmania/src/archutils/Unix/CrashHandler.cpp @@ -292,7 +292,10 @@ static void RunCrashHandler( const CrashData *crash ) /* Do this early, so functions called below don't end up on the backtrace. */ const void *BacktracePointers[BACKTRACE_MAX_SIZE]; - GetBacktrace( BacktracePointers, BACKTRACE_MAX_SIZE, &crash->ctx ); + if( crash->type == CrashData::FORCE_CRASH_THIS_THREAD ) + GetBacktrace( BacktracePointers, BACKTRACE_MAX_SIZE, NULL ); + else + GetBacktrace( BacktracePointers, BACKTRACE_MAX_SIZE, &crash->ctx ); /* We need to be very careful, since we're under crash conditions. Let's fork * a process and exec ourself to get a clean environment to work in. */ @@ -333,7 +336,6 @@ void ForceCrashHandler( const char *reason ) strncpy( crash.reason, reason, sizeof(crash.reason) ); crash.reason[ sizeof(crash.reason)-1 ] = 0; - GetCurrentBacktraceContext( &crash.ctx ); RunCrashHandler( &crash ); } diff --git a/stepmania/src/archutils/Unix/CrashHandlerInternal.h b/stepmania/src/archutils/Unix/CrashHandlerInternal.h index 638583fe41..72daf38d1e 100644 --- a/stepmania/src/archutils/Unix/CrashHandlerInternal.h +++ b/stepmania/src/archutils/Unix/CrashHandlerInternal.h @@ -22,6 +22,7 @@ struct CrashData // FORCE_CRASH_DEADLOCK } type; + /* Everything except FORCE_CRASH_THIS_THREAD: */ BacktraceContext ctx; /* FORCE_CRASH_DEADLOCK only: */ diff --git a/stepmania/src/archutils/Unix/LinuxThreadHelpers.cpp b/stepmania/src/archutils/Unix/LinuxThreadHelpers.cpp index 346359f572..00a04f8ef6 100644 --- a/stepmania/src/archutils/Unix/LinuxThreadHelpers.cpp +++ b/stepmania/src/archutils/Unix/LinuxThreadHelpers.cpp @@ -147,14 +147,14 @@ int ResumeThread( int ThreadID ) } -/* Get user_regs_struct for a thread. tid must not be the current thread. +/* Get a BacktraceContext for a thread. ThreadID must not be the current thread. * * tid() is a PID (from getpid) or a TID (from gettid). Note that this may have kernel compatibility * problems, because NPTL is new and its interactions with ptrace() aren't well-defined. * If we're on a non-NPTL system, tid is a regular PID. */ -int GetThreadContext( int ThreadID, BacktraceContext *ctx ) +bool GetThreadBacktraceContext( int ThreadID, BacktraceContext *ctx ) { - /* Can't GetThreadContext the current thread. */ + /* Can't GetThreadBacktraceContext the current thread. */ ASSERT( ThreadID != GetCurrentThreadId() ); /* Attach to the thread. */ @@ -187,7 +187,7 @@ int GetThreadContext( int ThreadID, BacktraceContext *ctx ) ASSERT( ret == 0 ); } - + ctx->pid = ThreadID; ctx->eip = regs.eip; ctx->esp = regs.esp; ctx->ebp = regs.ebp;