rsObjectBase.cpp revision fb6b614bcea88a587a7ea4530be45ff0ffa0210e
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" 18fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 19fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST 20e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams#include "rsContext.h" 21fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#else 22fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsContextHostStub.h" 23fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#endif 24326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 25326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android; 26326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript; 27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 28e514b45de8561fbc6ef6770845102ca10b0a69d7Jason SamsObjectBase::ObjectBase(Context *rsc) 29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 309397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams mUserRefCount = 0; 319397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams mSysRefCount = 0; 32e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams mRSC = NULL; 33e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams mNext = NULL; 34e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams mPrev = NULL; 35f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mAllocFile = __FILE__; 36f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mAllocLine = __LINE__; 37e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams setContext(rsc); 38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 40326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsObjectBase::~ObjectBase() 41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 42e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams //LOGV("~ObjectBase %p ref %i,%i", this, mUserRefCount, mSysRefCount); 439397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams rsAssert(!mUserRefCount); 449397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams rsAssert(!mSysRefCount); 45e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams remove(); 46e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams} 47e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams 48e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Samsvoid ObjectBase::dumpLOGV(const char *op) const 49f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams{ 50fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (mName.size()) { 51f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams LOGV("%s RSobj %p, name %s, refs %i,%i from %s,%i links %p,%p,%p", 52fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk op, this, mName.string(), mUserRefCount, mSysRefCount, mAllocFile, mAllocLine, mNext, mPrev, mRSC); 53f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams } else { 54f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams LOGV("%s RSobj %p, no-name, refs %i,%i from %s,%i links %p,%p,%p", 55f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams op, this, mUserRefCount, mSysRefCount, mAllocFile, mAllocLine, mNext, mPrev, mRSC); 56f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams } 57f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams} 58f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams 59e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsvoid ObjectBase::setContext(Context *rsc) 60e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{ 61e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams if (mRSC) { 62e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams remove(); 63e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams } 64e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams mRSC = rsc; 65e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams if (rsc) { 66e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams add(); 67e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams } 68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 709397e30ce5fe3f6af9212a93b490836b04fdfffaJason Samsvoid ObjectBase::incUserRef() const 71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 729397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams mUserRefCount ++; 73992a0b70d8fd7a14f0c57bc3c7e16c1f269a6609Jason Sams //LOGV("ObjectBase %p inc ref %i", this, mRefCount); 74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 769397e30ce5fe3f6af9212a93b490836b04fdfffaJason Samsvoid ObjectBase::incSysRef() const 77326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 789397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams mSysRefCount ++; 799397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams //LOGV("ObjectBase %p inc ref %i", this, mRefCount); 809397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams} 819397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams 82e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsbool ObjectBase::checkDelete() const 839397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams{ 849397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams if (!(mSysRefCount | mUserRefCount)) { 851fddd90849deaae89b546ff492c345d485bbce42Jason Sams if (mRSC && mRSC->props.mLogObjects) { 86e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams dumpLOGV("checkDelete"); 879397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams } 889397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams delete this; 89e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams return true; 909397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams } 91e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams return false; 929397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams} 939397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams 94e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsbool ObjectBase::decUserRef() const 95e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{ 96e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams rsAssert(mUserRefCount > 0); 97e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams mUserRefCount --; 98f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams //dumpObj("decUserRef"); 99e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams return checkDelete(); 100e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams} 101e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams 102e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsbool ObjectBase::zeroUserRef() const 103e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{ 104e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams mUserRefCount = 0; 105f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams //dumpObj("zeroUserRef"); 106e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams return checkDelete(); 107e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams} 108e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams 109e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsbool ObjectBase::decSysRef() const 1109397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams{ 1119397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams rsAssert(mSysRefCount > 0); 1129397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams mSysRefCount --; 113f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams //dumpObj("decSysRef"); 114e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams return checkDelete(); 115326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 116326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 117a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Samsvoid ObjectBase::setName(const char *name) 118a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams{ 119fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mName.setTo(name); 120a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams} 121a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams 122a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Samsvoid ObjectBase::setName(const char *name, uint32_t len) 123a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams{ 124fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mName.setTo(name, len); 125a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams} 126a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams 127e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsvoid ObjectBase::add() const 128e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{ 129e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams rsAssert(!mNext); 130e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams rsAssert(!mPrev); 131e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams //LOGV("calling add rsc %p", mRSC); 132e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams mNext = mRSC->mObjHead; 133e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams if (mRSC->mObjHead) { 134e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams mRSC->mObjHead->mPrev = this; 135e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams } 136e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams mRSC->mObjHead = this; 137e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams} 138e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams 139e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsvoid ObjectBase::remove() const 140e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{ 141e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams //LOGV("calling remove rsc %p", mRSC); 142e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams if (!mRSC) { 143e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams rsAssert(!mPrev); 144e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams rsAssert(!mNext); 145e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams return; 146e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams } 147e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams if (mRSC->mObjHead == this) { 148e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams mRSC->mObjHead = mNext; 149e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams } 150e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams if (mPrev) { 151e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams mPrev->mNext = mNext; 152e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams } 153e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams if (mNext) { 154e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams mNext->mPrev = mPrev; 155e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams } 156e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams mPrev = NULL; 157e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams mNext = NULL; 158e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams} 159e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams 160e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Samsvoid ObjectBase::zeroAllUserRef(Context *rsc) 161e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams{ 1621fddd90849deaae89b546ff492c345d485bbce42Jason Sams if (rsc->props.mLogObjects) { 1631fddd90849deaae89b546ff492c345d485bbce42Jason Sams LOGV("Forcing release of all outstanding user refs."); 1641fddd90849deaae89b546ff492c345d485bbce42Jason Sams } 165e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams 166e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams // This operation can be slow, only to be called during context cleanup. 167e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams const ObjectBase * o = rsc->mObjHead; 168e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams while (o) { 169e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams //LOGE("o %p", o); 170e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams if (o->zeroUserRef()) { 171e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams // deleted the object and possibly others, restart from head. 172e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams o = rsc->mObjHead; 173e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams //LOGE("o head %p", o); 174e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams } else { 175e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams o = o->mNext; 176e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams //LOGE("o next %p", o); 177e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams } 178e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams } 179f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams 180f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams if (rsc->props.mLogObjects) { 181f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams LOGV("Objects remaining."); 18225afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams dumpAll(rsc); 183f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams } 184e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams} 185e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams 186c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Samsvoid ObjectBase::dumpAll(Context *rsc) 187c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams{ 18825afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams LOGV("Dumping all objects"); 18925afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams const ObjectBase * o = rsc->mObjHead; 19025afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams while (o) { 1918154954868694e1f233d87d4933a474518b1cb81Jason Sams LOGV(" Object %p", o); 19225afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams o->dumpLOGV(" "); 19325afc007f33952d6ba10297f7bab4053d30e2f72Jason Sams o = o->mNext; 194c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams } 195c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams} 196c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams 197