diff options
author | Jason Sams <rjsams@android.com> | 2009-09-25 16:37:33 -0700 |
---|---|---|
committer | Jason Sams <rjsams@android.com> | 2009-09-25 16:37:33 -0700 |
commit | 61f08d6fa7c7657e9fbcd17e9a1c5b9114bb3844 (patch) | |
tree | e836663efc3047198d5aef1723cee4e5556fe8c4 /libs/rs/rsObjectBase.cpp | |
parent | 66b2771d745aa66df5cf80b300b5ba0f936ff22e (diff) | |
download | frameworks_base-61f08d6fa7c7657e9fbcd17e9a1c5b9114bb3844.zip frameworks_base-61f08d6fa7c7657e9fbcd17e9a1c5b9114bb3844.tar.gz frameworks_base-61f08d6fa7c7657e9fbcd17e9a1c5b9114bb3844.tar.bz2 |
Improved object lifecycle tracking and fix leaks.
Diffstat (limited to 'libs/rs/rsObjectBase.cpp')
-rw-r--r-- | libs/rs/rsObjectBase.cpp | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/libs/rs/rsObjectBase.cpp b/libs/rs/rsObjectBase.cpp index 83fa482..720e8fc 100644 --- a/libs/rs/rsObjectBase.cpp +++ b/libs/rs/rsObjectBase.cpp @@ -28,6 +28,8 @@ ObjectBase::ObjectBase(Context *rsc) mRSC = NULL; mNext = NULL; mPrev = NULL; + mAllocFile = __FILE__; + mAllocLine = __LINE__; setContext(rsc); } @@ -39,6 +41,17 @@ ObjectBase::~ObjectBase() remove(); } +void ObjectBase::dumpObj(const char *op) const +{ + if (mName) { + LOGV("%s RSobj %p, name %s, refs %i,%i from %s,%i links %p,%p,%p", + op, this, mName, mUserRefCount, mSysRefCount, mAllocFile, mAllocLine, mNext, mPrev, mRSC); + } else { + LOGV("%s RSobj %p, no-name, refs %i,%i from %s,%i links %p,%p,%p", + op, this, mUserRefCount, mSysRefCount, mAllocFile, mAllocLine, mNext, mPrev, mRSC); + } +} + void ObjectBase::setContext(Context *rsc) { if (mRSC) { @@ -66,11 +79,7 @@ bool ObjectBase::checkDelete() const { if (!(mSysRefCount | mUserRefCount)) { if (mRSC && mRSC->props.mLogObjects) { - if (mName) { - LOGV("Deleting RS object %p, name %s", this, mName); - } else { - LOGV("Deleting RS object %p, no name", this); - } + dumpObj("checkDelete"); } delete this; return true; @@ -82,14 +91,14 @@ bool ObjectBase::decUserRef() const { rsAssert(mUserRefCount > 0); mUserRefCount --; - //LOGV("ObjectBase %p dec ref %i", this, mRefCount); + //dumpObj("decUserRef"); return checkDelete(); } bool ObjectBase::zeroUserRef() const { mUserRefCount = 0; - //LOGV("ObjectBase %p dec ref %i", this, mRefCount); + //dumpObj("zeroUserRef"); return checkDelete(); } @@ -97,7 +106,7 @@ bool ObjectBase::decSysRef() const { rsAssert(mSysRefCount > 0); mSysRefCount --; - //LOGV("ObjectBase %p dec ref %i", this, mRefCount); + //dumpObj("decSysRef"); return checkDelete(); } @@ -174,5 +183,14 @@ void ObjectBase::zeroAllUserRef(Context *rsc) //LOGE("o next %p", o); } } + + if (rsc->props.mLogObjects) { + LOGV("Objects remaining."); + o = rsc->mObjHead; + while (o) { + o->dumpObj(" "); + o = o->mNext; + } + } } |