1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-26 04:32:44 +01:00

Tweak CrashRecoveryContextCleanup to provide an easy method for clients to select between 'delete' and 'destructor' cleanups, and allow the destructor of CrashRecoveryContextCleanupRegister to be pseudo re-entrant.

llvm-svn: 127929
This commit is contained in:
Ted Kremenek 2011-03-19 00:59:37 +00:00
parent be390d8777
commit c4fa37479a
2 changed files with 23 additions and 6 deletions

View File

@ -95,10 +95,16 @@ public:
class CrashRecoveryContextCleanup {
public:
bool cleanupFired;
enum ProvidedCleanups { DeleteCleanup, DestructorCleanup };
CrashRecoveryContextCleanup() : cleanupFired(false) {}
virtual ~CrashRecoveryContextCleanup();
virtual void recoverResources() = 0;
template <typename T> static CrashRecoveryContextCleanup *create(T *);
template <typename T> static CrashRecoveryContextCleanup *create(T *,
ProvidedCleanups cleanupKind =
CrashRecoveryContextCleanup::DeleteCleanup);
private:
friend class CrashRecoveryContext;
@ -131,15 +137,25 @@ public:
template <typename T>
struct CrashRecoveryContextTrait {
static inline CrashRecoveryContextCleanup *createCleanup(T *resource) {
return new CrashRecoveryContextDeleteCleanup<T>(resource);
static inline CrashRecoveryContextCleanup *
createCleanup(T *resource,
CrashRecoveryContextCleanup::ProvidedCleanups cleanup) {
switch (cleanup) {
case CrashRecoveryContextCleanup::DeleteCleanup:
return new CrashRecoveryContextDeleteCleanup<T>(resource);
case CrashRecoveryContextCleanup::DestructorCleanup:
return new CrashRecoveryContextDestructorCleanup<T>(resource);
}
return 0;
}
};
template<typename T>
inline CrashRecoveryContextCleanup* CrashRecoveryContextCleanup::create(T *x) {
inline CrashRecoveryContextCleanup*
CrashRecoveryContextCleanup::create(T *x,
CrashRecoveryContextCleanup::ProvidedCleanups cleanupKind) {
return CrashRecoveryContext::GetCurrent() ?
CrashRecoveryContextTrait<T>::createCleanup(x) :
CrashRecoveryContextTrait<T>::createCleanup(x, cleanupKind) :
0;
}
@ -155,7 +171,7 @@ public:
context->registerCleanup(cleanup);
}
~CrashRecoveryContextCleanupRegistrar() {
if (cleanup) {
if (cleanup && !cleanup->cleanupFired) {
if (context)
context->unregisterCleanup(cleanup);
else

View File

@ -65,6 +65,7 @@ CrashRecoveryContext::~CrashRecoveryContext() {
while (i) {
CrashRecoveryContextCleanup *tmp = i;
i = tmp->next;
tmp->cleanupFired = true;
tmp->recoverResources();
delete tmp;
}