rsObjectBase.cpp revision e514b45de8561fbc6ef6770845102ca10b0a69d7
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;
31e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    setContext(rsc);
32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
34326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsObjectBase::~ObjectBase()
35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
36e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    //LOGV("~ObjectBase %p  ref %i,%i", this, mUserRefCount, mSysRefCount);
379397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    rsAssert(!mUserRefCount);
389397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    rsAssert(!mSysRefCount);
39e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    remove();
40e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
41e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
42e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsvoid ObjectBase::setContext(Context *rsc)
43e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{
44e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (mRSC) {
45e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        remove();
46e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
47e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mRSC = rsc;
48e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (rsc) {
49e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        add();
50e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
539397e30ce5fe3f6af9212a93b490836b04fdfffaJason Samsvoid ObjectBase::incUserRef() const
54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
559397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    mUserRefCount ++;
56992a0b70d8fd7a14f0c57bc3c7e16c1f269a6609Jason Sams    //LOGV("ObjectBase %p inc ref %i", this, mRefCount);
57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
599397e30ce5fe3f6af9212a93b490836b04fdfffaJason Samsvoid ObjectBase::incSysRef() const
60326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
619397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    mSysRefCount ++;
629397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    //LOGV("ObjectBase %p inc ref %i", this, mRefCount);
639397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams}
649397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
65e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsbool ObjectBase::checkDelete() const
669397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams{
679397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    if (!(mSysRefCount | mUserRefCount)) {
689397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        if (mName) {
699397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams            LOGV("Deleting RS object %p, name %s", this, mName);
709397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        } else {
719397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams            LOGV("Deleting RS object %p, no name", this);
729397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        }
739397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        delete this;
74e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        return true;
759397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    }
76e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    return false;
779397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams}
789397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
79e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsbool ObjectBase::decUserRef() const
80e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{
81e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    rsAssert(mUserRefCount > 0);
82e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mUserRefCount --;
83e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    //LOGV("ObjectBase %p dec ref %i", this, mRefCount);
84e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    return checkDelete();
85e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
86e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
87e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsbool ObjectBase::zeroUserRef() const
88e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{
89e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mUserRefCount = 0;
90e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    //LOGV("ObjectBase %p dec ref %i", this, mRefCount);
91e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    return checkDelete();
92e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
93e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
94e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsbool ObjectBase::decSysRef() const
959397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams{
969397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    rsAssert(mSysRefCount > 0);
979397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    mSysRefCount --;
98992a0b70d8fd7a14f0c57bc3c7e16c1f269a6609Jason Sams    //LOGV("ObjectBase %p dec ref %i", this, mRefCount);
99e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    return checkDelete();
100326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
101326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
102a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Samsvoid ObjectBase::setName(const char *name)
103a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams{
104a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    delete mName;
105a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    mName = NULL;
106a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    if (name) {
107a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams        mName = new char[strlen(name) +1];
108a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams        strcpy(mName, name);
109a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    }
110a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams}
111a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
112a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Samsvoid ObjectBase::setName(const char *name, uint32_t len)
113a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams{
114a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    delete mName;
115a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    mName = NULL;
116a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    if (name) {
117a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams        mName = new char[len + 1];
118a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams        memcpy(mName, name, len);
119a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams        mName[len] = 0;
120a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    }
121a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams}
122a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
123e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsvoid ObjectBase::add() const
124e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{
125e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    rsAssert(!mNext);
126e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    rsAssert(!mPrev);
127e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    //LOGV("calling add  rsc %p", mRSC);
128e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mNext = mRSC->mObjHead;
129e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (mRSC->mObjHead) {
130e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        mRSC->mObjHead->mPrev = this;
131e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
132e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mRSC->mObjHead = this;
133e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
134e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
135e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsvoid ObjectBase::remove() const
136e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{
137e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    //LOGV("calling remove  rsc %p", mRSC);
138e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (!mRSC) {
139e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        rsAssert(!mPrev);
140e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        rsAssert(!mNext);
141e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        return;
142e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
143e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (mRSC->mObjHead == this) {
144e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        mRSC->mObjHead = mNext;
145e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
146e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (mPrev) {
147e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        mPrev->mNext = mNext;
148e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
149e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    if (mNext) {
150e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        mNext->mPrev = mPrev;
151e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
152e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mPrev = NULL;
153e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    mNext = NULL;
154e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
155e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
156e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsvoid ObjectBase::zeroAllUserRef(Context *rsc)
157e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{
158e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    LOGV("Forcing release of all outstanding user refs.");
159e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
160e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    // This operation can be slow, only to be called during context cleanup.
161e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    const ObjectBase * o = rsc->mObjHead;
162e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    while (o) {
163e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        //LOGE("o %p", o);
164e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        if (o->zeroUserRef()) {
165e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            // deleted the object and possibly others, restart from head.
166e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            o = rsc->mObjHead;
167e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            //LOGE("o head %p", o);
168e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        } else {
169e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            o = o->mNext;
170e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams            //LOGE("o next %p", o);
171e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams        }
172e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    }
173e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams}
174e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams
175