diff options
| author | Ted Kremenek <kremenek@apple.com> | 2011-03-19 00:59:37 +0000 | 
|---|---|---|
| committer | Ted Kremenek <kremenek@apple.com> | 2011-03-19 00:59:37 +0000 | 
| commit | 32aea2e401cf79aea0890bf343e1f51e3fedfb89 (patch) | |
| tree | bd40a1043b2e79e23d5d40417c9cb679891548ed | |
| parent | 794a0714ad459bb971c038e544867d106ec43264 (diff) | |
| download | bcm5719-llvm-32aea2e401cf79aea0890bf343e1f51e3fedfb89.tar.gz bcm5719-llvm-32aea2e401cf79aea0890bf343e1f51e3fedfb89.zip  | |
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
| -rw-r--r-- | llvm/include/llvm/Support/CrashRecoveryContext.h | 28 | ||||
| -rw-r--r-- | llvm/lib/Support/CrashRecoveryContext.cpp | 1 | 
2 files changed, 23 insertions, 6 deletions
diff --git a/llvm/include/llvm/Support/CrashRecoveryContext.h b/llvm/include/llvm/Support/CrashRecoveryContext.h index 40b5286d901..6e975fe3a1c 100644 --- a/llvm/include/llvm/Support/CrashRecoveryContext.h +++ b/llvm/include/llvm/Support/CrashRecoveryContext.h @@ -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 diff --git a/llvm/lib/Support/CrashRecoveryContext.cpp b/llvm/lib/Support/CrashRecoveryContext.cpp index d4e21a3a826..e558662611f 100644 --- a/llvm/lib/Support/CrashRecoveryContext.cpp +++ b/llvm/lib/Support/CrashRecoveryContext.cpp @@ -65,6 +65,7 @@ CrashRecoveryContext::~CrashRecoveryContext() {    while (i) {      CrashRecoveryContextCleanup *tmp = i;      i = tmp->next; +    tmp->cleanupFired = true;      tmp->recoverResources();      delete tmp;    }  | 

