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