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