summaryrefslogtreecommitdiff
path: root/include/llvm/Support/CrashRecoveryContext.h
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2011-03-22 01:15:10 +0000
committerTed Kremenek <kremenek@apple.com>2011-03-22 01:15:10 +0000
commitafc9e06021d4682d0faab2bdad57d6252dfca946 (patch)
treee4ee23dbdba5fef4c21d96ec083bf62ef64be489 /include/llvm/Support/CrashRecoveryContext.h
parent116e2348edee6c216a9e37484b62fc2fda595208 (diff)
downloadllvm-afc9e06021d4682d0faab2bdad57d6252dfca946.tar.gz
llvm-afc9e06021d4682d0faab2bdad57d6252dfca946.tar.bz2
llvm-afc9e06021d4682d0faab2bdad57d6252dfca946.tar.xz
Rework CrashRecoveryContextCleanup to provide a simpler way to create cleanup objects, and provide a new cleanup for
decrementing reference counts of objects with intrusive reference counts. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@128055 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/Support/CrashRecoveryContext.h')
-rw-r--r--include/llvm/Support/CrashRecoveryContext.h112
1 files changed, 60 insertions, 52 deletions
diff --git a/include/llvm/Support/CrashRecoveryContext.h b/include/llvm/Support/CrashRecoveryContext.h
index 28b31f3a78..759d2f8c71 100644
--- a/include/llvm/Support/CrashRecoveryContext.h
+++ b/include/llvm/Support/CrashRecoveryContext.h
@@ -98,89 +98,97 @@ public:
};
class CrashRecoveryContextCleanup {
+protected:
+ CrashRecoveryContext *context;
+ CrashRecoveryContextCleanup(CrashRecoveryContext *context)
+ : context(context) {}
public:
bool cleanupFired;
- enum ProvidedCleanups { DeleteCleanup, DestructorCleanup };
CrashRecoveryContextCleanup() : cleanupFired(false) {}
virtual ~CrashRecoveryContextCleanup();
virtual void recoverResources() = 0;
-
- template <typename T> static CrashRecoveryContextCleanup *create(T *,
- ProvidedCleanups cleanupKind =
- CrashRecoveryContextCleanup::DeleteCleanup);
-
+
+ CrashRecoveryContext *getContext() const {
+ return context;
+ }
+
private:
friend class CrashRecoveryContext;
CrashRecoveryContextCleanup *prev, *next;
};
-template <typename T>
-class CrashRecoveryContextDestructorCleanup
- : public CrashRecoveryContextCleanup
-{
+template<typename DERIVED, typename T>
+class CrashRecoveryContextCleanupBase : public CrashRecoveryContextCleanup {
+protected:
T *resource;
+ CrashRecoveryContextCleanupBase(CrashRecoveryContext *context, T* resource)
+ : CrashRecoveryContextCleanup(context), resource(resource) {}
public:
- CrashRecoveryContextDestructorCleanup(T *resource) : resource(resource) {}
- virtual void recoverResources() {
- resource->~T();
+ static DERIVED *create(T *x) {
+ if (x) {
+ if (CrashRecoveryContext *context = CrashRecoveryContext::GetCurrent())
+ return new DERIVED(context, x);
+ }
+ return 0;
}
};
template <typename T>
-class CrashRecoveryContextDeleteCleanup
- : public CrashRecoveryContextCleanup
-{
- T *resource;
+class CrashRecoveryContextDestructorCleanup : public
+ CrashRecoveryContextCleanupBase<CrashRecoveryContextDestructorCleanup<T>, T> {
public:
- CrashRecoveryContextDeleteCleanup(T *resource) : resource(resource) {}
+ CrashRecoveryContextDestructorCleanup(CrashRecoveryContext *context,
+ T *resource)
+ : CrashRecoveryContextCleanupBase<
+ CrashRecoveryContextDestructorCleanup<T>, T>(context, resource) {}
+
virtual void recoverResources() {
- delete resource;
+ this->resource->~T();
}
};
template <typename T>
-struct CrashRecoveryContextTrait {
- 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;
- }
+class CrashRecoveryContextDeleteCleanup : public
+ CrashRecoveryContextCleanupBase<CrashRecoveryContextDeleteCleanup<T>, T> {
+public:
+ CrashRecoveryContextDeleteCleanup(CrashRecoveryContext *context, T *resource)
+ : CrashRecoveryContextCleanupBase<
+ CrashRecoveryContextDeleteCleanup<T>, T>(context, resource) {}
+
+ virtual void recoverResources() {
+ delete this->resource;
+ }
};
-template<typename T>
-inline CrashRecoveryContextCleanup*
-CrashRecoveryContextCleanup::create(T *x,
- CrashRecoveryContextCleanup::ProvidedCleanups cleanupKind) {
- return CrashRecoveryContext::GetCurrent() ?
- CrashRecoveryContextTrait<T>::createCleanup(x, cleanupKind) :
- 0;
-}
+template <typename T>
+class CrashRecoveryContextReleaseRefCleanup : public
+ CrashRecoveryContextCleanupBase<CrashRecoveryContextReleaseRefCleanup<T>, T>
+{
+public:
+ CrashRecoveryContextReleaseRefCleanup(CrashRecoveryContext *context,
+ T *resource)
+ : CrashRecoveryContextCleanupBase<CrashRecoveryContextReleaseRefCleanup<T>,
+ T>(context, resource) {}
+ virtual void recoverResources() {
+ this->resource->Release();
+ }
+};
+
+template <typename T, typename Cleanup = CrashRecoveryContextDeleteCleanup<T> >
class CrashRecoveryContextCleanupRegistrar {
- CrashRecoveryContext *context;
CrashRecoveryContextCleanup *cleanup;
public:
- CrashRecoveryContextCleanupRegistrar(CrashRecoveryContextCleanup *cleanup)
- : context(CrashRecoveryContext::GetCurrent()),
- cleanup(cleanup)
- {
- if (context && cleanup)
- context->registerCleanup(cleanup);
+ CrashRecoveryContextCleanupRegistrar(T *x)
+ : cleanup(Cleanup::create(x)) {
+ if (cleanup)
+ cleanup->getContext()->registerCleanup(cleanup);
}
+
~CrashRecoveryContextCleanupRegistrar() {
- if (cleanup && !cleanup->cleanupFired) {
- if (context)
- context->unregisterCleanup(cleanup);
- else
- delete cleanup;
- }
+ if (cleanup && !cleanup->cleanupFired)
+ cleanup->getContext()->unregisterCleanup(cleanup);
}
};
}