rsObjectBase.cpp revision fb6b614bcea88a587a7ea4530be45ff0ffa0210e
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
25326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android;
26326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript;
27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
28e514b45de8561fbc6ef6770845102ca10b0a69d7Jason SamsObjectBase::ObjectBase(Context *rsc)
29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
309397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    mUserRefCount = 0;
319397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    mSysRefCount = 0;
32e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mRSC = NULL;
33e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mNext = NULL;
34e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mPrev = NULL;
35f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mAllocFile = __FILE__;
36f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mAllocLine = __LINE__;
37e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    setContext(rsc);
38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
40326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsObjectBase::~ObjectBase()
41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
42e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    //LOGV("~ObjectBase %p  ref %i,%i", this, mUserRefCount, mSysRefCount);
439397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    rsAssert(!mUserRefCount);
449397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    rsAssert(!mSysRefCount);
45e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    remove();
46e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
47e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
48e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Samsvoid ObjectBase::dumpLOGV(const char *op) const
49f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams{
50fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    if (mName.size()) {
51f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams        LOGV("%s RSobj %p, name %s, refs %i,%i  from %s,%i links %p,%p,%p",
52fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk             op, this, mName.string(), mUserRefCount, mSysRefCount, mAllocFile, mAllocLine, mNext, mPrev, mRSC);
53f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    } else {
54f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams        LOGV("%s RSobj %p, no-name, refs %i,%i  from %s,%i links %p,%p,%p",
55f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams             op, this, mUserRefCount, mSysRefCount, mAllocFile, mAllocLine, mNext, mPrev, mRSC);
56f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    }
57f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams}
58f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams
59e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsvoid ObjectBase::setContext(Context *rsc)
60e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{
61e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (mRSC) {
62e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        remove();
63e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
64e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mRSC = rsc;
65e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (rsc) {
66e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        add();
67e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
709397e30ce5fe3f6af9212a93b490836b04fdfffaJason Samsvoid ObjectBase::incUserRef() const
71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
729397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    mUserRefCount ++;
73992a0b70d8fd7a14f0c57bc3c7e16c1f269a6609Jason Sams    //LOGV("ObjectBase %p inc ref %i", this, mRefCount);
74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
769397e30ce5fe3f6af9212a93b490836b04fdfffaJason Samsvoid ObjectBase::incSysRef() const
77326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
789397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    mSysRefCount ++;
799397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    //LOGV("ObjectBase %p inc ref %i", this, mRefCount);
809397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams}
819397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
82e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsbool ObjectBase::checkDelete() const
839397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams{
849397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    if (!(mSysRefCount | mUserRefCount)) {
851fddd90849deaae89b546ff492c345d485bbce42Jason Sams        if (mRSC && mRSC->props.mLogObjects) {
86e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams            dumpLOGV("checkDelete");
879397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        }
889397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        delete this;
89e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        return true;
909397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    }
91e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    return false;
929397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams}
939397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
94e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsbool ObjectBase::decUserRef() const
95e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{
96e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    rsAssert(mUserRefCount > 0);
97e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mUserRefCount --;
98f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    //dumpObj("decUserRef");
99e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    return checkDelete();
100e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
101e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
102e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsbool ObjectBase::zeroUserRef() const
103e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{
104e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mUserRefCount = 0;
105f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    //dumpObj("zeroUserRef");
106e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    return checkDelete();
107e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
108e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
109e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsbool ObjectBase::decSysRef() const
1109397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams{
1119397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    rsAssert(mSysRefCount > 0);
1129397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    mSysRefCount --;
113f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    //dumpObj("decSysRef");
114e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    return checkDelete();
115326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
116326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
117a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Samsvoid ObjectBase::setName(const char *name)
118a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams{
119fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    mName.setTo(name);
120a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams}
121a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
122a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Samsvoid ObjectBase::setName(const char *name, uint32_t len)
123a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams{
124fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    mName.setTo(name, len);
125a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams}
126a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
127e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsvoid ObjectBase::add() const
128e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{
129e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    rsAssert(!mNext);
130e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    rsAssert(!mPrev);
131e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    //LOGV("calling add  rsc %p", mRSC);
132e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mNext = mRSC->mObjHead;
133e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (mRSC->mObjHead) {
134e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        mRSC->mObjHead->mPrev = this;
135e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
136e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mRSC->mObjHead = this;
137e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
138e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
139e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsvoid ObjectBase::remove() const
140e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{
141e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    //LOGV("calling remove  rsc %p", mRSC);
142e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (!mRSC) {
143e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        rsAssert(!mPrev);
144e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        rsAssert(!mNext);
145e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        return;
146e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
147e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (mRSC->mObjHead == this) {
148e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        mRSC->mObjHead = mNext;
149e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
150e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (mPrev) {
151e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        mPrev->mNext = mNext;
152e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
153e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (mNext) {
154e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        mNext->mPrev = mPrev;
155e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
156e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mPrev = NULL;
157e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mNext = NULL;
158e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
159e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
160e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsvoid ObjectBase::zeroAllUserRef(Context *rsc)
161e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{
1621fddd90849deaae89b546ff492c345d485bbce42Jason Sams    if (rsc->props.mLogObjects) {
1631fddd90849deaae89b546ff492c345d485bbce42Jason Sams        LOGV("Forcing release of all outstanding user refs.");
1641fddd90849deaae89b546ff492c345d485bbce42Jason Sams    }
165e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
166e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    // This operation can be slow, only to be called during context cleanup.
167e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    const ObjectBase * o = rsc->mObjHead;
168e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    while (o) {
169e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        //LOGE("o %p", o);
170e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        if (o->zeroUserRef()) {
171e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            // deleted the object and possibly others, restart from head.
172e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            o = rsc->mObjHead;
173e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            //LOGE("o head %p", o);
174e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        } else {
175e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            o = o->mNext;
176e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            //LOGE("o next %p", o);
177e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        }
178e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
179f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams
180f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    if (rsc->props.mLogObjects) {
181f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams        LOGV("Objects remaining.");
18225afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams        dumpAll(rsc);
183f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    }
184e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
185e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
186c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Samsvoid ObjectBase::dumpAll(Context *rsc)
187c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams{
18825afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams    LOGV("Dumping all objects");
18925afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams    const ObjectBase * o = rsc->mObjHead;
19025afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams    while (o) {
1918154954868694e1f233d87d4933a474518b1cb81Jason Sams        LOGV(" Object %p", o);
19225afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams        o->dumpLOGV("  ");
19325afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams        o = o->mNext;
194c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams    }
195c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams}
196c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams
197