summaryrefslogtreecommitdiffstats
path: root/libs/rs/rsObjectBase.cpp
diff options
context:
space:
mode:
authorJason Sams <rjsams@android.com>2009-09-25 16:37:33 -0700
committerJason Sams <rjsams@android.com>2009-09-25 16:37:33 -0700
commit61f08d6fa7c7657e9fbcd17e9a1c5b9114bb3844 (patch)
treee836663efc3047198d5aef1723cee4e5556fe8c4 /libs/rs/rsObjectBase.cpp
parent66b2771d745aa66df5cf80b300b5ba0f936ff22e (diff)
downloadframeworks_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.cpp34
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;
+ }
+ }
}