rsObjectBase.h revision 0f6f72e19db852cc253fd2fc05459abdf8d5c3af
10f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines/*
20f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Copyright (C) 2009 The Android Open Source Project
30f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
40f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
50f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * you may not use this file except in compliance with the License.
60f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * You may obtain a copy of the License at
70f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
80f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *      http://www.apache.org/licenses/LICENSE-2.0
90f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Unless required by applicable law or agreed to in writing, software
110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * See the License for the specific language governing permissions and
140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * limitations under the License.
150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines */
160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#ifndef ANDROID_RS_OBJECT_BASE_H
180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#define ANDROID_RS_OBJECT_BASE_H
190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsUtils.h"
210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsDefines.h"
220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#define RS_OBJECT_DEBUG 0
240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include <utils/CallStack.h>
260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace android {
280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace renderscript {
290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass Context;
310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass OStream;
320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines// An element is a group of Components that occupies one cell in a structure.
340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass ObjectBase {
350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinespublic:
360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ObjectBase(Context *rsc);
370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void incSysRef() const;
390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    bool decSysRef() const;
400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void incUserRef() const;
420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    bool decUserRef() const;
430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    bool zeroUserRef() const;
440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    static bool checkDelete(const ObjectBase *);
460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    const char * getName() const {
480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return mName.string();
490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void setName(const char *);
510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void setName(const char *, uint32_t len);
520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    Context * getContext() const {return mRSC;}
540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    virtual bool freeChildren();
550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    static void zeroAllUserRef(Context *rsc);
570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    static void freeAllChildren(Context *rsc);
580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    static void dumpAll(Context *rsc);
590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    virtual void dumpLOGV(const char *prefix) const;
610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    virtual void serialize(Context *rsc, OStream *stream) const = 0;
620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    virtual RsA3DClassID getClassId() const = 0;
630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    static bool isValid(const Context *rsc, const ObjectBase *obj);
650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // The async lock is taken during object creation in non-rs threads
670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // and object deletion in the rs thread.
680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    static void asyncLock();
690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    static void asyncUnlock();
700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesprotected:
720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // Called inside the async lock for any object list management that is
730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // necessary in derived classes.
740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    virtual void preDestroy() const;
750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    Context *mRSC;
770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    virtual ~ObjectBase();
780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesprivate:
800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    static pthread_mutex_t gObjectInitMutex;
810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void add() const;
830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void remove() const;
840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    String8 mName;
860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mutable int32_t mSysRefCount;
870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mutable int32_t mUserRefCount;
880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mutable const ObjectBase * mPrev;
900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mutable const ObjectBase * mNext;
910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#if RS_OBJECT_DEBUG
930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    CallStack mStack;
940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#endif
950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines};
970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinestemplate<class T>
990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass ObjectBaseRef {
1000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinespublic:
1010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ObjectBaseRef() {
1020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mRef = NULL;
1030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ObjectBaseRef(const ObjectBaseRef &ref) {
1060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mRef = ref.get();
1070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (mRef) {
1080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            mRef->incSysRef();
1090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
1100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ObjectBaseRef(T *ref) {
1130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mRef = ref;
1140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (mRef) {
1150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            ref->incSysRef();
1160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
1170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ObjectBaseRef & operator= (const ObjectBaseRef &ref) {
1200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (&ref != this) {
1210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            set(ref);
1220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
1230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return *this;
1240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ~ObjectBaseRef() {
1270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        clear();
1280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void set(T *ref) {
1310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (mRef != ref) {
1320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            clear();
1330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            mRef = ref;
1340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            if (mRef) {
1350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                ref->incSysRef();
1360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
1370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
1380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void set(const ObjectBaseRef &ref) {
1410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        set(ref.mRef);
1420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void clear() {
1450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (mRef) {
1460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            mRef->decSysRef();
1470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
1480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mRef = NULL;
1490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    inline T * get() const {
1520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return mRef;
1530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    inline T * operator-> () const {
1560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return mRef;
1570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesprotected:
1600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    T * mRef;
1610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines};
1620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#endif //ANDROID_RS_OBJECT_BASE_H
1670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
168