From a8fa798246503c726b02b415bb1f1b26bc0b0159 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Tue, 17 Aug 2010 22:32:37 +0000 Subject: [PATCH] CrashRecovery: Add CrashRecoveryContext::GetCurrent(), so clients can find the active context from anywhere. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@111308 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/CrashRecoveryContext.h | 4 ++++ lib/Support/CrashRecoveryContext.cpp | 14 ++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/include/llvm/Support/CrashRecoveryContext.h b/include/llvm/Support/CrashRecoveryContext.h index 45a43fa1950..d66609fddfe 100644 --- a/include/llvm/Support/CrashRecoveryContext.h +++ b/include/llvm/Support/CrashRecoveryContext.h @@ -53,6 +53,10 @@ public: /// \brief Disable crash recovery. static void Disable(); + /// \brief Return the active context, if the code is currently executing in a + /// thread which is in a protected context. + static CrashRecoveryContext *GetCurrent(); + /// \brief Execute the provide callback function (with the given arguments) in /// a protected context. /// diff --git a/lib/Support/CrashRecoveryContext.cpp b/lib/Support/CrashRecoveryContext.cpp index d1ecbb74dac..296cc3e8f3b 100644 --- a/lib/Support/CrashRecoveryContext.cpp +++ b/lib/Support/CrashRecoveryContext.cpp @@ -23,12 +23,14 @@ struct CrashRecoveryContextImpl; static sys::ThreadLocal CurrentContext; struct CrashRecoveryContextImpl { + CrashRecoveryContext *CRC; std::string Backtrace; ::jmp_buf JumpBuffer; volatile unsigned Failed : 1; public: - CrashRecoveryContextImpl() : Failed(false) { + CrashRecoveryContextImpl(CrashRecoveryContext *CRC) : CRC(CRC), + Failed(false) { CurrentContext.set(this); } ~CrashRecoveryContextImpl() { @@ -56,6 +58,14 @@ CrashRecoveryContext::~CrashRecoveryContext() { delete CRCI; } +CrashRecoveryContext *CrashRecoveryContext::GetCurrent() { + const CrashRecoveryContextImpl *CRCI = CurrentContext.get(); + if (!CRCI) + return 0; + + return CRCI->CRC; +} + #ifdef LLVM_ON_WIN32 // FIXME: No real Win32 implementation currently. @@ -164,7 +174,7 @@ bool CrashRecoveryContext::RunSafely(void (*Fn)(void*), void *UserData) { // If crash recovery is disabled, do nothing. if (gCrashRecoveryEnabled) { assert(!Impl && "Crash recovery context already initialized!"); - CrashRecoveryContextImpl *CRCI = new CrashRecoveryContextImpl; + CrashRecoveryContextImpl *CRCI = new CrashRecoveryContextImpl(this); Impl = CRCI; if (setjmp(CRCI->JumpBuffer) != 0) {