rsObjectBase.cpp revision 225afd317e101a7be5fe02c0a86361146ea89f05
1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/* 2326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Copyright (C) 2009 The Android Open Source Project 3326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * you may not use this file except in compliance with the License. 6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * You may obtain a copy of the License at 7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Unless required by applicable law or agreed to in writing, software 11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * See the License for the specific language governing permissions and 14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * limitations under the License. 15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams */ 16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 17326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsObjectBase.h" 18fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 19fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST 20e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams#include "rsContext.h" 21fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#else 22fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsContextHostStub.h" 23fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#endif 24326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 25225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams 26326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android; 27326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript; 28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 292353ae303868d04e3a26002b2f2dc456c15e8170Jason Samspthread_mutex_t ObjectBase::gObjectInitMutex = PTHREAD_MUTEX_INITIALIZER; 302353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams 31e514b45de8561fbc6ef6770845102ca10b0a69d7Jason SamsObjectBase::ObjectBase(Context *rsc) 32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 339397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams mUserRefCount = 0; 349397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams mSysRefCount = 0; 352353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams mRSC = rsc; 36e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams mNext = NULL; 37e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams mPrev = NULL; 38225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams 39225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams#if RS_OBJECT_DEBUG 40225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams mStack.update(2); 41225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams#endif 422353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams 432353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams rsAssert(rsc); 442353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams add(); 45225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams //LOGV("ObjectBase %p con", this); 46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 48326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsObjectBase::~ObjectBase() 49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 50e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams //LOGV("~ObjectBase %p ref %i,%i", this, mUserRefCount, mSysRefCount); 51225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams#if RS_OBJECT_DEBUG 52225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams mStack.dump(); 53225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams#endif 54225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams 55225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams if(mPrev || mNext) { 56225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams // While the normal practice is to call remove before we call 57225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams // delete. Its possible for objects without a re-use list 58225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams // for avoiding duplication to be created on the stack. In those 59225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams // cases we need to remove ourself here. 60225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams asyncLock(); 61225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams remove(); 62225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams asyncUnlock(); 63225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams } 64225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams 659397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams rsAssert(!mUserRefCount); 669397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams rsAssert(!mSysRefCount); 67e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams} 68e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams 69e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Samsvoid ObjectBase::dumpLOGV(const char *op) const 70f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams{ 71fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (mName.size()) { 72225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams LOGV("%s RSobj %p, name %s, refs %i,%i links %p,%p,%p", 73225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams op, this, mName.string(), mUserRefCount, mSysRefCount, mNext, mPrev, mRSC); 74f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams } else { 75225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams LOGV("%s RSobj %p, no-name, refs %i,%i links %p,%p,%p", 76225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams op, this, mUserRefCount, mSysRefCount, mNext, mPrev, mRSC); 77f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams } 78f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams} 79f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams 802353ae303868d04e3a26002b2f2dc456c15e8170Jason Samsvoid ObjectBase::incUserRef() const 81e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{ 82225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams android_atomic_inc(&mUserRefCount); 83225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams //LOGV("ObjectBase %p incU ref %i, %i", this, mUserRefCount, mSysRefCount); 84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 86225afd317e101a7be5fe02c0a86361146ea89f05Jason Samsvoid ObjectBase::incSysRef() const 87326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 88225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams android_atomic_inc(&mSysRefCount); 89225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams //LOGV("ObjectBase %p incS ref %i, %i", this, mUserRefCount, mSysRefCount); 90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 92225afd317e101a7be5fe02c0a86361146ea89f05Jason Samsvoid ObjectBase::preDestroy() const 93326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 949397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams} 959397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams 96225afd317e101a7be5fe02c0a86361146ea89f05Jason Samsbool ObjectBase::checkDelete(const ObjectBase *ref) 979397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams{ 98225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams if (!ref) { 99225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams return false; 100225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams } 1012353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams 102225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams asyncLock(); 103225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams // This lock protects us against the non-RS threads changing 104225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams // the ref counts. At this point we should be the only thread 105225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams // working on them. 106225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams if (ref->mUserRefCount || ref->mSysRefCount) { 107225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams asyncUnlock(); 108225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams return false; 1099397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams } 110225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams 111225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams ref->remove(); 112225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams // At this point we can unlock because there should be no possible way 113225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams // for another thread to reference this object. 114225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams ref->preDestroy(); 115225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams asyncUnlock(); 116225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams delete ref; 117225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams return true; 1189397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams} 1199397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams 120225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams 121e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsbool ObjectBase::decUserRef() const 122e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{ 123225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams //LOGV("ObjectBase %p decU ref %i, %i", this, mUserRefCount, mSysRefCount); 124e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams rsAssert(mUserRefCount > 0); 125225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams if ((android_atomic_dec(&mUserRefCount) <= 1) && 126225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams (android_atomic_acquire_load(&mSysRefCount) <= 0)) { 127225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams return checkDelete(this); 128225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams } 129225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams return false; 130e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams} 131e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams 132e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsbool ObjectBase::zeroUserRef() const 133e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{ 134225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams //LOGV("ObjectBase %p zeroU ref %i, %i", this, mUserRefCount, mSysRefCount); 135225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams android_atomic_acquire_store(0, &mUserRefCount); 136225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams if (android_atomic_acquire_load(&mSysRefCount) <= 0) { 137225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams return checkDelete(this); 138225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams } 139225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams return false; 140e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams} 141e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams 142e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsbool ObjectBase::decSysRef() const 1439397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams{ 144225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams //LOGV("ObjectBase %p decS ref %i, %i", this, mUserRefCount, mSysRefCount); 1459397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams rsAssert(mSysRefCount > 0); 146225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams if ((android_atomic_dec(&mSysRefCount) <= 1) && 147225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams (android_atomic_acquire_load(&mUserRefCount) <= 0)) { 148225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams return checkDelete(this); 149225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams } 150225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams return false; 151326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 152326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 153a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Samsvoid ObjectBase::setName(const char *name) 154a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams{ 155fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mName.setTo(name); 156a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams} 157a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams 158a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Samsvoid ObjectBase::setName(const char *name, uint32_t len) 159a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams{ 160fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mName.setTo(name, len); 161a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams} 162a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams 163225afd317e101a7be5fe02c0a86361146ea89f05Jason Samsvoid ObjectBase::asyncLock() 1642353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams{ 1652353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams pthread_mutex_lock(&gObjectInitMutex); 1662353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams} 1672353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams 168225afd317e101a7be5fe02c0a86361146ea89f05Jason Samsvoid ObjectBase::asyncUnlock() 1692353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams{ 1702353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams pthread_mutex_unlock(&gObjectInitMutex); 1712353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams} 1722353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams 173e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsvoid ObjectBase::add() const 174e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{ 175225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams asyncLock(); 1762353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams 177e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams rsAssert(!mNext); 178e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams rsAssert(!mPrev); 179e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams //LOGV("calling add rsc %p", mRSC); 180e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams mNext = mRSC->mObjHead; 181e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams if (mRSC->mObjHead) { 182e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams mRSC->mObjHead->mPrev = this; 183e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams } 184e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams mRSC->mObjHead = this; 1852353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams 186225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams asyncUnlock(); 187e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams} 188e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams 189e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsvoid ObjectBase::remove() const 190e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{ 191e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams //LOGV("calling remove rsc %p", mRSC); 192e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams if (!mRSC) { 193e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams rsAssert(!mPrev); 194e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams rsAssert(!mNext); 195e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams return; 196e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams } 1972353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams 198e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams if (mRSC->mObjHead == this) { 199e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams mRSC->mObjHead = mNext; 200e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams } 201e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams if (mPrev) { 202e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams mPrev->mNext = mNext; 203e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams } 204e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams if (mNext) { 205e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams mNext->mPrev = mPrev; 206e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams } 207e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams mPrev = NULL; 208e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams mNext = NULL; 209e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams} 210e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams 211e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsvoid ObjectBase::zeroAllUserRef(Context *rsc) 212e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{ 2131fddd90849deaae89b546ff492c345d485bbce42Jason Sams if (rsc->props.mLogObjects) { 2141fddd90849deaae89b546ff492c345d485bbce42Jason Sams LOGV("Forcing release of all outstanding user refs."); 2151fddd90849deaae89b546ff492c345d485bbce42Jason Sams } 216e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams 217e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams // This operation can be slow, only to be called during context cleanup. 218e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams const ObjectBase * o = rsc->mObjHead; 219e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams while (o) { 220e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams //LOGE("o %p", o); 221e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams if (o->zeroUserRef()) { 222e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams // deleted the object and possibly others, restart from head. 223e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams o = rsc->mObjHead; 224e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams //LOGE("o head %p", o); 225e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams } else { 226e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams o = o->mNext; 227e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams //LOGE("o next %p", o); 228e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams } 229e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams } 230f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams 231f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams if (rsc->props.mLogObjects) { 232f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams LOGV("Objects remaining."); 23325afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams dumpAll(rsc); 234f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams } 235e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams} 236e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams 237c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Samsvoid ObjectBase::dumpAll(Context *rsc) 238c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams{ 239225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams asyncLock(); 2402353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams 24125afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams LOGV("Dumping all objects"); 24225afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams const ObjectBase * o = rsc->mObjHead; 24325afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams while (o) { 2448154954868694e1f233d87d4933a474518b1cb81Jason Sams LOGV(" Object %p", o); 24525afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams o->dumpLOGV(" "); 24625afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams o = o->mNext; 247c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams } 2482353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams 249225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams asyncUnlock(); 250c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams} 251c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams 252605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Samsbool ObjectBase::isValid(const Context *rsc, const ObjectBase *obj) 253605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams{ 254225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams asyncLock(); 2552353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams 256605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams const ObjectBase * o = rsc->mObjHead; 257605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams while (o) { 258605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams if (o == obj) { 259225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams asyncUnlock(); 260605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams return true; 261605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams } 262605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams o = o->mNext; 263605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams } 264225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams asyncUnlock(); 265605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams return false; 266605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams} 267605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams 268