diff options
| author | 2011-06-13 18:44:20 -0700 | |
|---|---|---|
| committer | 2011-06-13 18:44:20 -0700 | |
| commit | 14f58ffceb917151c9940786320415331f340185 (patch) | |
| tree | e62920cb72761fbeea008ad7ea270789e110b4d8 /libs/utils/RefBase.cpp | |
| parent | b375d3c7e1ec6a2614845adc9c142ef650136205 (diff) | |
| parent | eb99f0d9f05dd37f988a815e6bc01bbd7152c31a (diff) | |
Merge "fix RefBase so it retains binary-compatibility with gingerbread"
Diffstat (limited to 'libs/utils/RefBase.cpp')
| -rw-r--r-- | libs/utils/RefBase.cpp | 34 | 
1 files changed, 25 insertions, 9 deletions
diff --git a/libs/utils/RefBase.cpp b/libs/utils/RefBase.cpp index 58e0811f21a0..8db2009587f7 100644 --- a/libs/utils/RefBase.cpp +++ b/libs/utils/RefBase.cpp @@ -49,6 +49,11 @@ namespace android {  // --------------------------------------------------------------------------- +RefBase::Destroyer::~Destroyer() { +} + +// --------------------------------------------------------------------------- +  class RefBase::weakref_impl : public RefBase::weakref_type  {  public: @@ -56,7 +61,7 @@ public:      volatile int32_t    mWeak;      RefBase* const      mBase;      volatile int32_t    mFlags; - +    Destroyer*          mDestroyer;  #if !DEBUG_REFS @@ -65,6 +70,7 @@ public:          , mWeak(0)          , mBase(base)          , mFlags(0) +        , mDestroyer(0)      {      } @@ -345,10 +351,6 @@ void RefBase::incStrong(const void* id) const      const_cast<RefBase*>(this)->onFirstRef();  } -void RefBase::destroy() const { -    delete this; -} -  void RefBase::decStrong(const void* id) const  {      weakref_impl* const refs = mRefs; @@ -361,7 +363,11 @@ void RefBase::decStrong(const void* id) const      if (c == 1) {          const_cast<RefBase*>(this)->onLastStrongRef(id);          if ((refs->mFlags&OBJECT_LIFETIME_WEAK) != OBJECT_LIFETIME_WEAK) { -            destroy(); +            if (refs->mDestroyer) { +                refs->mDestroyer->destroy(this); +            } else { +                delete this; +            }          }      }      refs->decWeak(id); @@ -394,7 +400,9 @@ int32_t RefBase::getStrongCount() const      return mRefs->mStrong;  } - +void RefBase::setDestroyer(RefBase::Destroyer* destroyer) { +    mRefs->mDestroyer = destroyer; +}  RefBase* RefBase::weakref_type::refBase() const  { @@ -420,7 +428,11 @@ void RefBase::weakref_type::decWeak(const void* id)      if ((impl->mFlags&OBJECT_LIFETIME_WEAK) != OBJECT_LIFETIME_WEAK) {          if (impl->mStrong == INITIAL_STRONG_VALUE) {              if (impl->mBase) { -                impl->mBase->destroy(); +                if (impl->mDestroyer) { +                    impl->mDestroyer->destroy(impl->mBase); +                } else { +                    delete impl->mBase; +                }              }          } else {              // LOGV("Freeing refs %p of old RefBase %p\n", this, impl->mBase); @@ -430,7 +442,11 @@ void RefBase::weakref_type::decWeak(const void* id)          impl->mBase->onLastWeakRef(id);          if ((impl->mFlags&OBJECT_LIFETIME_FOREVER) != OBJECT_LIFETIME_FOREVER) {              if (impl->mBase) { -                impl->mBase->destroy(); +                if (impl->mDestroyer) { +                    impl->mDestroyer->destroy(impl->mBase); +                } else { +                    delete impl->mBase; +                }              }          }      }  |