rsObjectBase.cpp revision 25afc007f33952d6ba10297f7bab4053d30e2f72
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"
18e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams#include "rsContext.h"
19326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
20326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android;
21326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript;
22326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
23e514b45de8561fbc6ef6770845102ca10b0a69d7Jason SamsObjectBase::ObjectBase(Context *rsc)
24326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
259397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    mUserRefCount = 0;
269397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    mSysRefCount = 0;
27a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    mName = NULL;
28e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mRSC = NULL;
29e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mNext = NULL;
30e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mPrev = NULL;
31f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mAllocFile = __FILE__;
32f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mAllocLine = __LINE__;
33e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    setContext(rsc);
34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
36326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsObjectBase::~ObjectBase()
37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
38e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    //LOGV("~ObjectBase %p  ref %i,%i", this, mUserRefCount, mSysRefCount);
399397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    rsAssert(!mUserRefCount);
409397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    rsAssert(!mSysRefCount);
41e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    remove();
42bf3c14ebf456c745c084605dddeda08afdfc7987Jason Sams    delete[] mName;
43e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
44e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
45e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Samsvoid ObjectBase::dumpLOGV(const char *op) const
46f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams{
47f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    if (mName) {
48f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams        LOGV("%s RSobj %p, name %s, refs %i,%i  from %s,%i links %p,%p,%p",
49f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams             op, this, mName, mUserRefCount, mSysRefCount, mAllocFile, mAllocLine, mNext, mPrev, mRSC);
50f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    } else {
51f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams        LOGV("%s RSobj %p, no-name, refs %i,%i  from %s,%i links %p,%p,%p",
52f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams             op, this, mUserRefCount, mSysRefCount, mAllocFile, mAllocLine, mNext, mPrev, mRSC);
53f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    }
54f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams}
55f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams
56e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsvoid ObjectBase::setContext(Context *rsc)
57e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{
58e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (mRSC) {
59e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        remove();
60e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
61e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mRSC = rsc;
62e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (rsc) {
63e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        add();
64e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
679397e30ce5fe3f6af9212a93b490836b04fdfffaJason Samsvoid ObjectBase::incUserRef() const
68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
699397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    mUserRefCount ++;
70992a0b70d8fd7a14f0c57bc3c7e16c1f269a6609Jason Sams    //LOGV("ObjectBase %p inc ref %i", this, mRefCount);
71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
739397e30ce5fe3f6af9212a93b490836b04fdfffaJason Samsvoid ObjectBase::incSysRef() const
74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
759397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    mSysRefCount ++;
769397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    //LOGV("ObjectBase %p inc ref %i", this, mRefCount);
779397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams}
789397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
79e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsbool ObjectBase::checkDelete() const
809397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams{
819397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    if (!(mSysRefCount | mUserRefCount)) {
821fddd90849deaae89b546ff492c345d485bbce42Jason Sams        if (mRSC && mRSC->props.mLogObjects) {
83e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams            dumpLOGV("checkDelete");
849397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        }
859397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        delete this;
86e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        return true;
879397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    }
88e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    return false;
899397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams}
909397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
91e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsbool ObjectBase::decUserRef() const
92e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{
93e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    rsAssert(mUserRefCount > 0);
94e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mUserRefCount --;
95f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    //dumpObj("decUserRef");
96e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    return checkDelete();
97e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
98e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
99e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsbool ObjectBase::zeroUserRef() const
100e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{
101e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mUserRefCount = 0;
102f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    //dumpObj("zeroUserRef");
103e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    return checkDelete();
104e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
105e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
106e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsbool ObjectBase::decSysRef() const
1079397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams{
1089397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    rsAssert(mSysRefCount > 0);
1099397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    mSysRefCount --;
110f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    //dumpObj("decSysRef");
111e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    return checkDelete();
112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
113326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
114a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Samsvoid ObjectBase::setName(const char *name)
115a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams{
116e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    setName(name, strlen(name));
117a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams}
118a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
119a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Samsvoid ObjectBase::setName(const char *name, uint32_t len)
120a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams{
121a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    delete mName;
122a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    mName = NULL;
123a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    if (name) {
124a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams        mName = new char[len + 1];
125a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams        memcpy(mName, name, len);
126a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams        mName[len] = 0;
127a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    }
128a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams}
129a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
130e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsvoid ObjectBase::add() const
131e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{
132e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    rsAssert(!mNext);
133e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    rsAssert(!mPrev);
134e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    //LOGV("calling add  rsc %p", mRSC);
135e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mNext = mRSC->mObjHead;
136e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (mRSC->mObjHead) {
137e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        mRSC->mObjHead->mPrev = this;
138e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
139e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mRSC->mObjHead = this;
140e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
141e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
142e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsvoid ObjectBase::remove() const
143e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{
144e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    //LOGV("calling remove  rsc %p", mRSC);
145e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (!mRSC) {
146e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        rsAssert(!mPrev);
147e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        rsAssert(!mNext);
148e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        return;
149e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
150e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (mRSC->mObjHead == this) {
151e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        mRSC->mObjHead = mNext;
152e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
153e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (mPrev) {
154e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        mPrev->mNext = mNext;
155e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
156e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (mNext) {
157e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        mNext->mPrev = mPrev;
158e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
159e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mPrev = NULL;
160e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mNext = NULL;
161e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
162e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
163e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsvoid ObjectBase::zeroAllUserRef(Context *rsc)
164e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{
1651fddd90849deaae89b546ff492c345d485bbce42Jason Sams    if (rsc->props.mLogObjects) {
1661fddd90849deaae89b546ff492c345d485bbce42Jason Sams        LOGV("Forcing release of all outstanding user refs.");
1671fddd90849deaae89b546ff492c345d485bbce42Jason Sams    }
168e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
169e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    // This operation can be slow, only to be called during context cleanup.
170e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    const ObjectBase * o = rsc->mObjHead;
171e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    while (o) {
172e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        //LOGE("o %p", o);
173e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        if (o->zeroUserRef()) {
174e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            // deleted the object and possibly others, restart from head.
175e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            o = rsc->mObjHead;
176e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            //LOGE("o head %p", o);
177e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        } else {
178e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            o = o->mNext;
179e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            //LOGE("o next %p", o);
180e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        }
181e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
182f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams
183f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    if (rsc->props.mLogObjects) {
184f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams        LOGV("Objects remaining.");
18525afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams        dumpAll(rsc);
186f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    }
187e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
188e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
189c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Samsvoid ObjectBase::dumpAll(Context *rsc)
190c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams{
19125afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams    LOGV("Dumping all objects");
19225afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams    const ObjectBase * o = rsc->mObjHead;
19325afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams    while (o) {
19425afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams        o->dumpLOGV("  ");
19525afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams        o = o->mNext;
196c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams    }
197c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams}
198c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams
199