Provide a means for CrashRecovery clients to determine if code is currently running while crash recovery cleanups are being processed.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@128008 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Ted Kremenek 2011-03-21 18:38:03 +00:00
parent 47f0f1856f
commit b52fde4185
2 changed files with 13 additions and 0 deletions

View File

@ -63,6 +63,10 @@ public:
/// thread which is in a protected context.
static CrashRecoveryContext *GetCurrent();
/// \brief Return true if the current thread is recovering from a
/// crash.
static bool isRecoveringFromCrash();
/// \brief Execute the provide callback function (with the given arguments) in
/// a protected context.
///

View File

@ -57,11 +57,15 @@ public:
static sys::Mutex gCrashRecoveryContexMutex;
static bool gCrashRecoveryEnabled = false;
static sys::ThreadLocal<const CrashRecoveryContextCleanup>
tlIsRecoveringFromCrash;
CrashRecoveryContextCleanup::~CrashRecoveryContextCleanup() {}
CrashRecoveryContext::~CrashRecoveryContext() {
// Reclaim registered resources.
CrashRecoveryContextCleanup *i = head;
tlIsRecoveringFromCrash.set(head);
while (i) {
CrashRecoveryContextCleanup *tmp = i;
i = tmp->next;
@ -69,11 +73,16 @@ CrashRecoveryContext::~CrashRecoveryContext() {
tmp->recoverResources();
delete tmp;
}
tlIsRecoveringFromCrash.erase();
CrashRecoveryContextImpl *CRCI = (CrashRecoveryContextImpl *) Impl;
delete CRCI;
}
bool CrashRecoveryContext::isRecoveringFromCrash() {
return tlIsRecoveringFromCrash.get() != 0;
}
CrashRecoveryContext *CrashRecoveryContext::GetCurrent() {
if (!gCrashRecoveryEnabled)
return 0;