rsObjectBase.cpp revision f2649a961db2995e9e24a6c98f8a419f1496c1b7
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();
42e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
43e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
44f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Samsvoid ObjectBase::dumpObj(const char *op) const
45f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams{
46f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    if (mName) {
47f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams        LOGV("%s RSobj %p, name %s, refs %i,%i  from %s,%i links %p,%p,%p",
48f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams             op, this, mName, mUserRefCount, mSysRefCount, mAllocFile, mAllocLine, mNext, mPrev, mRSC);
49f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    } else {
50f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams        LOGV("%s RSobj %p, no-name, refs %i,%i  from %s,%i links %p,%p,%p",
51f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams             op, this, mUserRefCount, mSysRefCount, mAllocFile, mAllocLine, mNext, mPrev, mRSC);
52f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    }
53f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams}
54f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams
55e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsvoid ObjectBase::setContext(Context *rsc)
56e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{
57e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (mRSC) {
58e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        remove();
59e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
60e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mRSC = rsc;
61e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (rsc) {
62e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        add();
63e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
64326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
669397e30ce5fe3f6af9212a93b490836b04fdfffaJason Samsvoid ObjectBase::incUserRef() const
67326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
689397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    mUserRefCount ++;
69992a0b70d8fd7a14f0c57bc3c7e16c1f269a6609Jason Sams    //LOGV("ObjectBase %p inc ref %i", this, mRefCount);
70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
729397e30ce5fe3f6af9212a93b490836b04fdfffaJason Samsvoid ObjectBase::incSysRef() const
73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
749397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    mSysRefCount ++;
759397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    //LOGV("ObjectBase %p inc ref %i", this, mRefCount);
769397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams}
779397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
78e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsbool ObjectBase::checkDelete() const
799397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams{
809397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    if (!(mSysRefCount | mUserRefCount)) {
811fddd90849deaae89b546ff492c345d485bbce42Jason Sams        if (mRSC && mRSC->props.mLogObjects) {
82f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams            dumpObj("checkDelete");
839397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        }
849397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        delete this;
85e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        return true;
869397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    }
87e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    return false;
889397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams}
899397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
90e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsbool ObjectBase::decUserRef() const
91e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{
92e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    rsAssert(mUserRefCount > 0);
93e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mUserRefCount --;
94f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    //dumpObj("decUserRef");
95e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    return checkDelete();
96e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
97e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
98e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsbool ObjectBase::zeroUserRef() const
99e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{
100e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mUserRefCount = 0;
101f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    //dumpObj("zeroUserRef");
102e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    return checkDelete();
103e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
104e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
105e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsbool ObjectBase::decSysRef() const
1069397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams{
1079397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    rsAssert(mSysRefCount > 0);
1089397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    mSysRefCount --;
109f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    //dumpObj("decSysRef");
110e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    return checkDelete();
111326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
113a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Samsvoid ObjectBase::setName(const char *name)
114a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams{
115a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    delete mName;
116a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    mName = NULL;
117a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    if (name) {
118a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams        mName = new char[strlen(name) +1];
119a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams        strcpy(mName, name);
120a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    }
121a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams}
122a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
123a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Samsvoid ObjectBase::setName(const char *name, uint32_t len)
124a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams{
125a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    delete mName;
126a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    mName = NULL;
127a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    if (name) {
128a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams        mName = new char[len + 1];
129a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams        memcpy(mName, name, len);
130a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams        mName[len] = 0;
131a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    }
132a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams}
133a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
134e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsvoid ObjectBase::add() const
135e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{
136e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    rsAssert(!mNext);
137e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    rsAssert(!mPrev);
138e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    //LOGV("calling add  rsc %p", mRSC);
139e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mNext = mRSC->mObjHead;
140e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (mRSC->mObjHead) {
141e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        mRSC->mObjHead->mPrev = this;
142e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
143e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mRSC->mObjHead = this;
144e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
145e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
146e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsvoid ObjectBase::remove() const
147e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{
148e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    //LOGV("calling remove  rsc %p", mRSC);
149e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (!mRSC) {
150e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        rsAssert(!mPrev);
151e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        rsAssert(!mNext);
152e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        return;
153e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
154e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (mRSC->mObjHead == this) {
155e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        mRSC->mObjHead = mNext;
156e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
157e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (mPrev) {
158e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        mPrev->mNext = mNext;
159e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
160e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (mNext) {
161e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        mNext->mPrev = mPrev;
162e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
163e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mPrev = NULL;
164e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mNext = NULL;
165e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
166e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
167e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsvoid ObjectBase::zeroAllUserRef(Context *rsc)
168e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{
1691fddd90849deaae89b546ff492c345d485bbce42Jason Sams    if (rsc->props.mLogObjects) {
1701fddd90849deaae89b546ff492c345d485bbce42Jason Sams        LOGV("Forcing release of all outstanding user refs.");
1711fddd90849deaae89b546ff492c345d485bbce42Jason Sams    }
172e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
173e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    // This operation can be slow, only to be called during context cleanup.
174e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    const ObjectBase * o = rsc->mObjHead;
175e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    while (o) {
176e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        //LOGE("o %p", o);
177e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        if (o->zeroUserRef()) {
178e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            // deleted the object and possibly others, restart from head.
179e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            o = rsc->mObjHead;
180e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            //LOGE("o head %p", o);
181e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        } else {
182e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            o = o->mNext;
183e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            //LOGE("o next %p", o);
184e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        }
185e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
186f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams
187f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    if (rsc->props.mLogObjects) {
188f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams        LOGV("Objects remaining.");
189f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams        o = rsc->mObjHead;
190f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams        while (o) {
191f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams            o->dumpObj("  ");
192f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams            o = o->mNext;
193f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams        }
194f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    }
195e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
196e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
197