[llvm-commits] [llvm] r128055 - /llvm/trunk/include/llvm/Support/CrashRecoveryContext.h

Ted Kremenek kremenek at apple.com
Mon Mar 21 18:15:10 PDT 2011


Author: kremenek
Date: Mon Mar 21 20:15:10 2011
New Revision: 128055

URL: http://llvm.org/viewvc/llvm-project?rev=128055&view=rev
Log:
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.

Modified:
    llvm/trunk/include/llvm/Support/CrashRecoveryContext.h

Modified: llvm/trunk/include/llvm/Support/CrashRecoveryContext.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/CrashRecoveryContext.h?rev=128055&r1=128054&r2=128055&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/CrashRecoveryContext.h (original)
+++ llvm/trunk/include/llvm/Support/CrashRecoveryContext.h Mon Mar 21 20:15:10 2011
@@ -98,89 +98,97 @@
 };
 
 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);
   }
 };
 }





More information about the llvm-commits mailing list