rsObjectBase.cpp revision c21cf40f6ae69091bf24f87b5eeabc95e73dd271
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."); 185f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams o = rsc->mObjHead; 186f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams while (o) { 187e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams o->dumpLOGV(" "); 188f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams o = o->mNext; 189f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams } 190f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams } 191e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams} 192e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams 193c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Samsvoid ObjectBase::dumpAll(Context *rsc) 194c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams{ 195c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams if (rsc->props.mLogObjects) { 196c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams LOGV("Dumping all objects"); 197c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams const ObjectBase * o = rsc->mObjHead; 198c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams while (o) { 199c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams o->dumpLOGV(" "); 200c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams o = o->mNext; 201c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams } 202c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams } 203c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams} 204c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams 205