Loading include/utils/RefBase.h +13 −7 Original line number Diff line number Diff line Loading @@ -112,16 +112,22 @@ public: getWeakRefs()->trackMe(enable, retain); } protected: RefBase(); virtual ~RefBase(); // used to override the RefBase destruction. class Destroyer { friend class RefBase; public: virtual ~Destroyer(); private: virtual void destroy(RefBase const* base) = 0; }; // called when the last reference goes away. this is responsible for // calling the destructor. The default implementation just does // "delete this;". // Make sure to never acquire a strong reference from this function. The // same restrictions than for destructors apply. virtual void destroy() const; void setDestroyer(Destroyer* destroyer); protected: RefBase(); virtual ~RefBase(); //! Flags for extendObjectLifetime() enum { Loading libs/utils/RefBase.cpp +25 −9 Original line number Diff line number Diff line Loading @@ -48,6 +48,11 @@ namespace android { // --------------------------------------------------------------------------- RefBase::Destroyer::~Destroyer() { } // --------------------------------------------------------------------------- class RefBase::weakref_impl : public RefBase::weakref_type { public: Loading @@ -55,7 +60,7 @@ public: volatile int32_t mWeak; RefBase* const mBase; volatile int32_t mFlags; Destroyer* mDestroyer; #if !DEBUG_REFS Loading @@ -64,6 +69,7 @@ public: , mWeak(0) , mBase(base) , mFlags(0) , mDestroyer(0) { } Loading Loading @@ -298,10 +304,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; Loading @@ -314,7 +316,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->removeWeakRef(id); Loading Loading @@ -349,7 +355,9 @@ int32_t RefBase::getStrongCount() const return mRefs->mStrong; } void RefBase::setDestroyer(RefBase::Destroyer* destroyer) { mRefs->mDestroyer = destroyer; } RefBase* RefBase::weakref_type::refBase() const { Loading @@ -375,7 +383,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); Loading @@ -385,7 +397,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; } } } } Loading services/surfaceflinger/Layer.cpp +3 −2 Original line number Diff line number Diff line Loading @@ -60,6 +60,7 @@ Layer::Layer(SurfaceFlinger* flinger, mWidth(0), mHeight(0), mNeedsScaling(false), mFixedSize(false), mBypassState(false) { setDestroyer(this); } Layer::~Layer() Loading @@ -76,8 +77,8 @@ Layer::~Layer() } } void Layer::destroy() const { mFlinger->destroyLayer(this); void Layer::destroy(RefBase const* base) { mFlinger->destroyLayer(static_cast<LayerBase const*>(base)); } status_t Layer::setToken(const sp<UserClient>& userClient, Loading services/surfaceflinger/Layer.h +2 −2 Original line number Diff line number Diff line Loading @@ -44,7 +44,7 @@ class UserClient; // --------------------------------------------------------------------------- class Layer : public LayerBaseClient class Layer : public LayerBaseClient, private RefBase::Destroyer { public: Layer(SurfaceFlinger* flinger, DisplayID display, Loading Loading @@ -94,7 +94,7 @@ public: return mFreezeLock; } protected: virtual void destroy() const; virtual void destroy(RefBase const* base); virtual void dump(String8& result, char* scratch, size_t size) const; private: Loading Loading
include/utils/RefBase.h +13 −7 Original line number Diff line number Diff line Loading @@ -112,16 +112,22 @@ public: getWeakRefs()->trackMe(enable, retain); } protected: RefBase(); virtual ~RefBase(); // used to override the RefBase destruction. class Destroyer { friend class RefBase; public: virtual ~Destroyer(); private: virtual void destroy(RefBase const* base) = 0; }; // called when the last reference goes away. this is responsible for // calling the destructor. The default implementation just does // "delete this;". // Make sure to never acquire a strong reference from this function. The // same restrictions than for destructors apply. virtual void destroy() const; void setDestroyer(Destroyer* destroyer); protected: RefBase(); virtual ~RefBase(); //! Flags for extendObjectLifetime() enum { Loading
libs/utils/RefBase.cpp +25 −9 Original line number Diff line number Diff line Loading @@ -48,6 +48,11 @@ namespace android { // --------------------------------------------------------------------------- RefBase::Destroyer::~Destroyer() { } // --------------------------------------------------------------------------- class RefBase::weakref_impl : public RefBase::weakref_type { public: Loading @@ -55,7 +60,7 @@ public: volatile int32_t mWeak; RefBase* const mBase; volatile int32_t mFlags; Destroyer* mDestroyer; #if !DEBUG_REFS Loading @@ -64,6 +69,7 @@ public: , mWeak(0) , mBase(base) , mFlags(0) , mDestroyer(0) { } Loading Loading @@ -298,10 +304,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; Loading @@ -314,7 +316,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->removeWeakRef(id); Loading Loading @@ -349,7 +355,9 @@ int32_t RefBase::getStrongCount() const return mRefs->mStrong; } void RefBase::setDestroyer(RefBase::Destroyer* destroyer) { mRefs->mDestroyer = destroyer; } RefBase* RefBase::weakref_type::refBase() const { Loading @@ -375,7 +383,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); Loading @@ -385,7 +397,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; } } } } Loading
services/surfaceflinger/Layer.cpp +3 −2 Original line number Diff line number Diff line Loading @@ -60,6 +60,7 @@ Layer::Layer(SurfaceFlinger* flinger, mWidth(0), mHeight(0), mNeedsScaling(false), mFixedSize(false), mBypassState(false) { setDestroyer(this); } Layer::~Layer() Loading @@ -76,8 +77,8 @@ Layer::~Layer() } } void Layer::destroy() const { mFlinger->destroyLayer(this); void Layer::destroy(RefBase const* base) { mFlinger->destroyLayer(static_cast<LayerBase const*>(base)); } status_t Layer::setToken(const sp<UserClient>& userClient, Loading
services/surfaceflinger/Layer.h +2 −2 Original line number Diff line number Diff line Loading @@ -44,7 +44,7 @@ class UserClient; // --------------------------------------------------------------------------- class Layer : public LayerBaseClient class Layer : public LayerBaseClient, private RefBase::Destroyer { public: Layer(SurfaceFlinger* flinger, DisplayID display, Loading Loading @@ -94,7 +94,7 @@ public: return mFreezeLock; } protected: virtual void destroy() const; virtual void destroy(RefBase const* base); virtual void dump(String8& result, char* scratch, size_t size) const; private: Loading