1*e1eccf28SAndroid Build Coastguard Worker /* 2*e1eccf28SAndroid Build Coastguard Worker * Copyright (C) 2009 The Android Open Source Project 3*e1eccf28SAndroid Build Coastguard Worker * 4*e1eccf28SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*e1eccf28SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*e1eccf28SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*e1eccf28SAndroid Build Coastguard Worker * 8*e1eccf28SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*e1eccf28SAndroid Build Coastguard Worker * 10*e1eccf28SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*e1eccf28SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*e1eccf28SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*e1eccf28SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*e1eccf28SAndroid Build Coastguard Worker * limitations under the License. 15*e1eccf28SAndroid Build Coastguard Worker */ 16*e1eccf28SAndroid Build Coastguard Worker 17*e1eccf28SAndroid Build Coastguard Worker #ifndef ANDROID_RS_OBJECT_BASE_H 18*e1eccf28SAndroid Build Coastguard Worker #define ANDROID_RS_OBJECT_BASE_H 19*e1eccf28SAndroid Build Coastguard Worker 20*e1eccf28SAndroid Build Coastguard Worker #include "rsUtils.h" 21*e1eccf28SAndroid Build Coastguard Worker #include "rsDefines.h" 22*e1eccf28SAndroid Build Coastguard Worker #include "rsInternalDefines.h" 23*e1eccf28SAndroid Build Coastguard Worker 24*e1eccf28SAndroid Build Coastguard Worker namespace android { 25*e1eccf28SAndroid Build Coastguard Worker namespace renderscript { 26*e1eccf28SAndroid Build Coastguard Worker 27*e1eccf28SAndroid Build Coastguard Worker class Context; 28*e1eccf28SAndroid Build Coastguard Worker class OStream; 29*e1eccf28SAndroid Build Coastguard Worker 30*e1eccf28SAndroid Build Coastguard Worker // An element is a group of Components that occupies one cell in a structure. 31*e1eccf28SAndroid Build Coastguard Worker class ObjectBase { 32*e1eccf28SAndroid Build Coastguard Worker public: 33*e1eccf28SAndroid Build Coastguard Worker static const bool gDebugStacks = false; 34*e1eccf28SAndroid Build Coastguard Worker static const bool gDebugReferences = false; 35*e1eccf28SAndroid Build Coastguard Worker static const bool gDebugLeaks = false; 36*e1eccf28SAndroid Build Coastguard Worker static const bool gDebugLifetime = false; 37*e1eccf28SAndroid Build Coastguard Worker 38*e1eccf28SAndroid Build Coastguard Worker ObjectBase(Context *rsc); // NOLINT, implicit 39*e1eccf28SAndroid Build Coastguard Worker 40*e1eccf28SAndroid Build Coastguard Worker void incSysRef() const; 41*e1eccf28SAndroid Build Coastguard Worker bool decSysRef() const; 42*e1eccf28SAndroid Build Coastguard Worker 43*e1eccf28SAndroid Build Coastguard Worker void incUserRef() const; 44*e1eccf28SAndroid Build Coastguard Worker bool decUserRef() const; 45*e1eccf28SAndroid Build Coastguard Worker bool zeroUserRef() const; 46*e1eccf28SAndroid Build Coastguard Worker 47*e1eccf28SAndroid Build Coastguard Worker static bool checkDelete(const ObjectBase *); 48*e1eccf28SAndroid Build Coastguard Worker getName()49*e1eccf28SAndroid Build Coastguard Worker const char * getName() const { 50*e1eccf28SAndroid Build Coastguard Worker return mName; 51*e1eccf28SAndroid Build Coastguard Worker } assignName(const char * s)52*e1eccf28SAndroid Build Coastguard Worker void assignName(const char *s) {mName = s;} 53*e1eccf28SAndroid Build Coastguard Worker void setName(const char *); 54*e1eccf28SAndroid Build Coastguard Worker void setName(const char *, uint32_t len); 55*e1eccf28SAndroid Build Coastguard Worker getContext()56*e1eccf28SAndroid Build Coastguard Worker Context * getContext() const {return mRSC;} 57*e1eccf28SAndroid Build Coastguard Worker virtual bool freeChildren(); 58*e1eccf28SAndroid Build Coastguard Worker 59*e1eccf28SAndroid Build Coastguard Worker static void zeroAllUserRef(Context *rsc); 60*e1eccf28SAndroid Build Coastguard Worker static void freeAllChildren(Context *rsc); 61*e1eccf28SAndroid Build Coastguard Worker static void dumpAll(Context *rsc); 62*e1eccf28SAndroid Build Coastguard Worker 63*e1eccf28SAndroid Build Coastguard Worker virtual void dumpLOGV(const char *prefix) const; 64*e1eccf28SAndroid Build Coastguard Worker virtual void serialize(Context *rsc, OStream *stream) const = 0; 65*e1eccf28SAndroid Build Coastguard Worker virtual RsA3DClassID getClassId() const = 0; 66*e1eccf28SAndroid Build Coastguard Worker 67*e1eccf28SAndroid Build Coastguard Worker static bool isValid(const Context *rsc, const ObjectBase *obj); 68*e1eccf28SAndroid Build Coastguard Worker 69*e1eccf28SAndroid Build Coastguard Worker // The async lock is taken during object creation in non-rs threads 70*e1eccf28SAndroid Build Coastguard Worker // and object deletion in the rs thread. 71*e1eccf28SAndroid Build Coastguard Worker static void asyncLock(); 72*e1eccf28SAndroid Build Coastguard Worker static void asyncUnlock(); 73*e1eccf28SAndroid Build Coastguard Worker 74*e1eccf28SAndroid Build Coastguard Worker virtual void callUpdateCacheObject(const Context *rsc, void *dstObj) const; 75*e1eccf28SAndroid Build Coastguard Worker 76*e1eccf28SAndroid Build Coastguard Worker protected: 77*e1eccf28SAndroid Build Coastguard Worker // Called inside the async lock for any object list management that is 78*e1eccf28SAndroid Build Coastguard Worker // necessary in derived classes. 79*e1eccf28SAndroid Build Coastguard Worker virtual void preDestroy() const; 80*e1eccf28SAndroid Build Coastguard Worker 81*e1eccf28SAndroid Build Coastguard Worker Context *mRSC; 82*e1eccf28SAndroid Build Coastguard Worker virtual ~ObjectBase(); 83*e1eccf28SAndroid Build Coastguard Worker 84*e1eccf28SAndroid Build Coastguard Worker private: 85*e1eccf28SAndroid Build Coastguard Worker static pthread_mutex_t gObjectInitMutex; 86*e1eccf28SAndroid Build Coastguard Worker 87*e1eccf28SAndroid Build Coastguard Worker void add() const; 88*e1eccf28SAndroid Build Coastguard Worker void remove() const; 89*e1eccf28SAndroid Build Coastguard Worker 90*e1eccf28SAndroid Build Coastguard Worker const char* mName; 91*e1eccf28SAndroid Build Coastguard Worker mutable int32_t mSysRefCount; 92*e1eccf28SAndroid Build Coastguard Worker mutable int32_t mUserRefCount; 93*e1eccf28SAndroid Build Coastguard Worker 94*e1eccf28SAndroid Build Coastguard Worker mutable const ObjectBase * mPrev; 95*e1eccf28SAndroid Build Coastguard Worker mutable const ObjectBase * mNext; 96*e1eccf28SAndroid Build Coastguard Worker 97*e1eccf28SAndroid Build Coastguard Worker class DebugHelper *mDH; 98*e1eccf28SAndroid Build Coastguard Worker }; 99*e1eccf28SAndroid Build Coastguard Worker 100*e1eccf28SAndroid Build Coastguard Worker template<class T> 101*e1eccf28SAndroid Build Coastguard Worker class ObjectBaseRef { 102*e1eccf28SAndroid Build Coastguard Worker public: ObjectBaseRef()103*e1eccf28SAndroid Build Coastguard Worker ObjectBaseRef() { 104*e1eccf28SAndroid Build Coastguard Worker mRef = nullptr; 105*e1eccf28SAndroid Build Coastguard Worker } 106*e1eccf28SAndroid Build Coastguard Worker ObjectBaseRef(const ObjectBaseRef & ref)107*e1eccf28SAndroid Build Coastguard Worker ObjectBaseRef(const ObjectBaseRef &ref) { 108*e1eccf28SAndroid Build Coastguard Worker mRef = ref.get(); 109*e1eccf28SAndroid Build Coastguard Worker if (mRef) { 110*e1eccf28SAndroid Build Coastguard Worker mRef->incSysRef(); 111*e1eccf28SAndroid Build Coastguard Worker } 112*e1eccf28SAndroid Build Coastguard Worker } 113*e1eccf28SAndroid Build Coastguard Worker ObjectBaseRef(T * ref)114*e1eccf28SAndroid Build Coastguard Worker ObjectBaseRef(T *ref) { // NOLINT, implicit 115*e1eccf28SAndroid Build Coastguard Worker mRef = ref; 116*e1eccf28SAndroid Build Coastguard Worker if (mRef) { 117*e1eccf28SAndroid Build Coastguard Worker ref->incSysRef(); 118*e1eccf28SAndroid Build Coastguard Worker } 119*e1eccf28SAndroid Build Coastguard Worker } 120*e1eccf28SAndroid Build Coastguard Worker 121*e1eccf28SAndroid Build Coastguard Worker ObjectBaseRef & operator= (const ObjectBaseRef &ref) { 122*e1eccf28SAndroid Build Coastguard Worker if (&ref != this) { 123*e1eccf28SAndroid Build Coastguard Worker set(ref); 124*e1eccf28SAndroid Build Coastguard Worker } 125*e1eccf28SAndroid Build Coastguard Worker return *this; 126*e1eccf28SAndroid Build Coastguard Worker } 127*e1eccf28SAndroid Build Coastguard Worker ~ObjectBaseRef()128*e1eccf28SAndroid Build Coastguard Worker ~ObjectBaseRef() { 129*e1eccf28SAndroid Build Coastguard Worker clear(); 130*e1eccf28SAndroid Build Coastguard Worker } 131*e1eccf28SAndroid Build Coastguard Worker set(T * ref)132*e1eccf28SAndroid Build Coastguard Worker void set(T *ref) { 133*e1eccf28SAndroid Build Coastguard Worker if (mRef != ref) { 134*e1eccf28SAndroid Build Coastguard Worker clear(); 135*e1eccf28SAndroid Build Coastguard Worker mRef = ref; 136*e1eccf28SAndroid Build Coastguard Worker if (mRef) { 137*e1eccf28SAndroid Build Coastguard Worker ref->incSysRef(); 138*e1eccf28SAndroid Build Coastguard Worker } 139*e1eccf28SAndroid Build Coastguard Worker } 140*e1eccf28SAndroid Build Coastguard Worker } 141*e1eccf28SAndroid Build Coastguard Worker set(const ObjectBaseRef & ref)142*e1eccf28SAndroid Build Coastguard Worker void set(const ObjectBaseRef &ref) { 143*e1eccf28SAndroid Build Coastguard Worker set(ref.mRef); 144*e1eccf28SAndroid Build Coastguard Worker } 145*e1eccf28SAndroid Build Coastguard Worker clear()146*e1eccf28SAndroid Build Coastguard Worker void clear() { 147*e1eccf28SAndroid Build Coastguard Worker if (mRef) { 148*e1eccf28SAndroid Build Coastguard Worker mRef->decSysRef(); 149*e1eccf28SAndroid Build Coastguard Worker } 150*e1eccf28SAndroid Build Coastguard Worker mRef = nullptr; 151*e1eccf28SAndroid Build Coastguard Worker } 152*e1eccf28SAndroid Build Coastguard Worker get()153*e1eccf28SAndroid Build Coastguard Worker inline T * get() const { 154*e1eccf28SAndroid Build Coastguard Worker return mRef; 155*e1eccf28SAndroid Build Coastguard Worker } 156*e1eccf28SAndroid Build Coastguard Worker 157*e1eccf28SAndroid Build Coastguard Worker inline T * operator-> () const { 158*e1eccf28SAndroid Build Coastguard Worker return mRef; 159*e1eccf28SAndroid Build Coastguard Worker } 160*e1eccf28SAndroid Build Coastguard Worker 161*e1eccf28SAndroid Build Coastguard Worker protected: 162*e1eccf28SAndroid Build Coastguard Worker T * mRef; 163*e1eccf28SAndroid Build Coastguard Worker }; 164*e1eccf28SAndroid Build Coastguard Worker 165*e1eccf28SAndroid Build Coastguard Worker } // namespace renderscript 166*e1eccf28SAndroid Build Coastguard Worker } // namespace android 167*e1eccf28SAndroid Build Coastguard Worker 168*e1eccf28SAndroid Build Coastguard Worker #endif //ANDROID_RS_OBJECT_BASE_H 169*e1eccf28SAndroid Build Coastguard Worker 170