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