rsObjectBase.cpp revision afb743aca56c18beb7ab924e75cb6e070ef3e55a
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
31afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukObjectBase::ObjectBase(Context *rsc) {
329397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    mUserRefCount = 0;
339397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    mSysRefCount = 0;
342353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams    mRSC = rsc;
35e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mNext = NULL;
36e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mPrev = NULL;
37225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams
38225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams#if RS_OBJECT_DEBUG
39225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    mStack.update(2);
40225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams#endif
412353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams
422353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams    rsAssert(rsc);
432353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams    add();
44225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    //LOGV("ObjectBase %p con", this);
45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
47afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukObjectBase::~ObjectBase() {
48e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    //LOGV("~ObjectBase %p  ref %i,%i", this, mUserRefCount, mSysRefCount);
49225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams#if RS_OBJECT_DEBUG
50225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    mStack.dump();
51225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams#endif
52225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams
53afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (mPrev || mNext) {
54225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams        // While the normal practice is to call remove before we call
55225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams        // delete.  Its possible for objects without a re-use list
56225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams        // for avoiding duplication to be created on the stack.  In those
57225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams        // cases we need to remove ourself here.
58225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams        asyncLock();
59225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams        remove();
60225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams        asyncUnlock();
61225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    }
62225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams
639397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    rsAssert(!mUserRefCount);
649397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    rsAssert(!mSysRefCount);
65e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
66e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
67afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ObjectBase::dumpLOGV(const char *op) const {
68fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    if (mName.size()) {
69225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams        LOGV("%s RSobj %p, name %s, refs %i,%i  links %p,%p,%p",
70225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams             op, this, mName.string(), mUserRefCount, mSysRefCount, mNext, mPrev, mRSC);
71f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    } else {
72225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams        LOGV("%s RSobj %p, no-name, refs %i,%i  links %p,%p,%p",
73225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams             op, this, mUserRefCount, mSysRefCount, mNext, mPrev, mRSC);
74f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    }
75f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams}
76f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams
77afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ObjectBase::incUserRef() const {
78225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    android_atomic_inc(&mUserRefCount);
79225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    //LOGV("ObjectBase %p incU ref %i, %i", this, mUserRefCount, mSysRefCount);
80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
81326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
82afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ObjectBase::incSysRef() const {
83225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    android_atomic_inc(&mSysRefCount);
84225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    //LOGV("ObjectBase %p incS ref %i, %i", this, mUserRefCount, mSysRefCount);
85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
87afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ObjectBase::preDestroy() const {
889397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams}
899397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
90afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool ObjectBase::checkDelete(const ObjectBase *ref) {
91225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    if (!ref) {
92225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams        return false;
93225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    }
942353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams
95225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    asyncLock();
96225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    // This lock protects us against the non-RS threads changing
97225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    // the ref counts.  At this point we should be the only thread
98225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    // working on them.
99225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    if (ref->mUserRefCount || ref->mSysRefCount) {
100225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams        asyncUnlock();
101225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams        return false;
1029397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    }
103225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams
104225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    ref->remove();
105225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    // At this point we can unlock because there should be no possible way
106225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    // for another thread to reference this object.
107225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    ref->preDestroy();
108225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    asyncUnlock();
109225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    delete ref;
110225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    return true;
1119397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams}
1129397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
113afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool ObjectBase::decUserRef() const {
114e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    rsAssert(mUserRefCount > 0);
115f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams#if RS_OBJECT_DEBUG
116f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    LOGV("ObjectBase %p decU ref %i, %i", this, mUserRefCount, mSysRefCount);
117f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    if (mUserRefCount <= 0) {
118f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams        mStack.dump();
119f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    }
120f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams#endif
121f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams
122f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams
123225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    if ((android_atomic_dec(&mUserRefCount) <= 1) &&
124225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams        (android_atomic_acquire_load(&mSysRefCount) <= 0)) {
125225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams        return checkDelete(this);
126225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    }
127225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    return false;
128e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
129e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
130afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool ObjectBase::zeroUserRef() const {
131225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    //LOGV("ObjectBase %p zeroU ref %i, %i", this, mUserRefCount, mSysRefCount);
132225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    android_atomic_acquire_store(0, &mUserRefCount);
133225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    if (android_atomic_acquire_load(&mSysRefCount) <= 0) {
134225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams        return checkDelete(this);
135225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    }
136225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    return false;
137e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
138e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
139afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool ObjectBase::decSysRef() const {
140225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    //LOGV("ObjectBase %p decS ref %i, %i", this, mUserRefCount, mSysRefCount);
1419397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    rsAssert(mSysRefCount > 0);
142225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    if ((android_atomic_dec(&mSysRefCount) <= 1) &&
143225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams        (android_atomic_acquire_load(&mUserRefCount) <= 0)) {
144225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams        return checkDelete(this);
145225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    }
146225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    return false;
147326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
148326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
149afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ObjectBase::setName(const char *name) {
150fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    mName.setTo(name);
151a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams}
152a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
153afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ObjectBase::setName(const char *name, uint32_t len) {
154fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    mName.setTo(name, len);
155a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams}
156a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
157afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ObjectBase::asyncLock() {
1582353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams    pthread_mutex_lock(&gObjectInitMutex);
1592353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams}
1602353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams
161afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ObjectBase::asyncUnlock() {
1622353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams    pthread_mutex_unlock(&gObjectInitMutex);
1632353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams}
1642353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams
165afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ObjectBase::add() const {
166225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    asyncLock();
1672353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams
168e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    rsAssert(!mNext);
169e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    rsAssert(!mPrev);
170e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    //LOGV("calling add  rsc %p", mRSC);
171e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mNext = mRSC->mObjHead;
172e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (mRSC->mObjHead) {
173e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        mRSC->mObjHead->mPrev = this;
174e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
175e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mRSC->mObjHead = this;
1762353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams
177225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    asyncUnlock();
178e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
179e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
180afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ObjectBase::remove() const {
181e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    //LOGV("calling remove  rsc %p", mRSC);
182e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (!mRSC) {
183e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        rsAssert(!mPrev);
184e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        rsAssert(!mNext);
185e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        return;
186e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
1872353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams
188e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (mRSC->mObjHead == this) {
189e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        mRSC->mObjHead = mNext;
190e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
191e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (mPrev) {
192e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        mPrev->mNext = mNext;
193e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
194e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (mNext) {
195e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        mNext->mPrev = mPrev;
196e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
197e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mPrev = NULL;
198e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mNext = NULL;
199e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
200e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
201afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ObjectBase::zeroAllUserRef(Context *rsc) {
2021fddd90849deaae89b546ff492c345d485bbce42Jason Sams    if (rsc->props.mLogObjects) {
2031fddd90849deaae89b546ff492c345d485bbce42Jason Sams        LOGV("Forcing release of all outstanding user refs.");
2041fddd90849deaae89b546ff492c345d485bbce42Jason Sams    }
205e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
206e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    // This operation can be slow, only to be called during context cleanup.
207e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    const ObjectBase * o = rsc->mObjHead;
208e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    while (o) {
209e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        //LOGE("o %p", o);
210e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        if (o->zeroUserRef()) {
211e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            // deleted the object and possibly others, restart from head.
212e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            o = rsc->mObjHead;
213e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            //LOGE("o head %p", o);
214e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        } else {
215e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            o = o->mNext;
216e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            //LOGE("o next %p", o);
217e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        }
218e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
219f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams
220f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    if (rsc->props.mLogObjects) {
221f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams        LOGV("Objects remaining.");
22225afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams        dumpAll(rsc);
223f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    }
224e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
225e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
226afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ObjectBase::dumpAll(Context *rsc) {
227225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    asyncLock();
2282353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams
22925afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams    LOGV("Dumping all objects");
23025afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams    const ObjectBase * o = rsc->mObjHead;
23125afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams    while (o) {
2328154954868694e1f233d87d4933a474518b1cb81Jason Sams        LOGV(" Object %p", o);
23325afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams        o->dumpLOGV("  ");
23425afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams        o = o->mNext;
235c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams    }
2362353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams
237225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    asyncUnlock();
238c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams}
239c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams
240afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool ObjectBase::isValid(const Context *rsc, const ObjectBase *obj) {
241225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    asyncLock();
2422353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams
243605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    const ObjectBase * o = rsc->mObjHead;
244605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    while (o) {
245605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams        if (o == obj) {
246225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams            asyncUnlock();
247605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams            return true;
248605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams        }
249605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams        o = o->mNext;
250605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    }
251225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    asyncUnlock();
252605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    return false;
253605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams}
254605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams
255