diff options
| -rw-r--r-- | libs/rs/rsContext.cpp | 2 | ||||
| -rw-r--r-- | libs/rs/rsFont.cpp | 21 | ||||
| -rw-r--r-- | libs/rs/rsFont.h | 1 | ||||
| -rw-r--r-- | libs/rs/rsScript.cpp | 2 | ||||
| -rw-r--r-- | libs/rs/rsScriptC.cpp | 24 | ||||
| -rw-r--r-- | libs/rs/rsScriptC.h | 4 |
6 files changed, 36 insertions, 18 deletions
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index 40cb5c7..1dfedb3 100644 --- a/libs/rs/rsContext.cpp +++ b/libs/rs/rsContext.cpp @@ -528,6 +528,7 @@ void * Context::threadProc(void *vrsc) { void Context::destroyWorkerThreadResources() { //LOGV("destroyWorkerThreadResources 1"); + ObjectBase::zeroAllUserRef(this); if (mIsGraphicsContext) { mRaster.clear(); mFragment.clear(); @@ -542,7 +543,6 @@ void Context::destroyWorkerThreadResources() { mStateFont.deinit(this); mShaderCache.cleanupAll(); } - ObjectBase::zeroAllUserRef(this); //LOGV("destroyWorkerThreadResources 2"); mExit = true; } diff --git a/libs/rs/rsFont.cpp b/libs/rs/rsFont.cpp index 8571c32..7fdfbe0 100644 --- a/libs/rs/rsFont.cpp +++ b/libs/rs/rsFont.cpp @@ -74,6 +74,15 @@ bool Font::init(const char *name, float fontSize, uint32_t dpi, const void *data return true; } +void Font::preDestroy() const { + for (uint32_t ct = 0; ct < mRSC->mStateFont.mActiveFonts.size(); ct++) { + if (mRSC->mStateFont.mActiveFonts[ct] == this) { + mRSC->mStateFont.mActiveFonts.removeAt(ct); + break; + } + } +} + void Font::invalidateTextureCache() { for (uint32_t i = 0; i < mCachedGlyphs.size(); i ++) { mCachedGlyphs.valueAt(i)->mIsValid = false; @@ -309,13 +318,6 @@ Font::~Font() { FT_Done_Face(mFace); } - for (uint32_t ct = 0; ct < mRSC->mStateFont.mActiveFonts.size(); ct++) { - if (mRSC->mStateFont.mActiveFonts[ct] == this) { - mRSC->mStateFont.mActiveFonts.removeAt(ct); - break; - } - } - for (uint32_t i = 0; i < mCachedGlyphs.size(); i ++) { CachedGlyphInfo *glyph = mCachedGlyphs.valueAt(i); delete glyph; @@ -799,11 +801,6 @@ void FontState::deinit(Context *rsc) { mDefault.clear(); - Vector<Font*> fontsToDereference = mActiveFonts; - for (uint32_t i = 0; i < fontsToDereference.size(); i ++) { - fontsToDereference[i]->zeroUserRef(); - } - if (mLibrary) { FT_Done_FreeType( mLibrary ); mLibrary = NULL; diff --git a/libs/rs/rsFont.h b/libs/rs/rsFont.h index 00d77c8..4820999 100644 --- a/libs/rs/rsFont.h +++ b/libs/rs/rsFont.h @@ -119,6 +119,7 @@ protected: Font(Context *rsc); bool init(const char *name, float fontSize, uint32_t dpi, const void *data = NULL, uint32_t dataLen = 0); + virtual void preDestroy() const; FT_Face mFace; bool mInitialized; bool mHasKerning; diff --git a/libs/rs/rsScript.cpp b/libs/rs/rsScript.cpp index efdc626..9ada9c2 100644 --- a/libs/rs/rsScript.cpp +++ b/libs/rs/rsScript.cpp @@ -78,8 +78,6 @@ void Script::setVarObj(uint32_t slot, ObjectBase *val) { (*destPtr)->decSysRef(); } *destPtr = val; - } else { - LOGV("Calling setVarObj on slot = %i which is null. This is dangerous because the script will not hold a ref count on the object.", slot); } } diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp index 3858e1c..fc673a2 100644 --- a/libs/rs/rsScriptC.cpp +++ b/libs/rs/rsScriptC.cpp @@ -94,16 +94,24 @@ char *genCacheFileName(const char *cacheDir, } ScriptC::ScriptC(Context *rsc) : Script(rsc) { - LOGD(">>>> ScriptC ctor called, obj=%p", this); mBccScript = NULL; memset(&mProgram, 0, sizeof(mProgram)); } ScriptC::~ScriptC() { - LOGD(">>>> ~ScriptC() mBccScript = %p", mBccScript); if (mBccScript) { + if (mProgram.mObjectSlotList) { + for (size_t ct=0; ct < mProgram.mObjectSlotCount; ct++) { + setVarObj(mProgram.mObjectSlotList[ct], NULL); + } + delete [] mProgram.mObjectSlotList; + mProgram.mObjectSlotList = NULL; + mProgram.mObjectSlotCount = 0; + } + + + LOGD(">>>> ~ScriptC bccDisposeScript(%p)", mBccScript); bccDisposeScript(mBccScript); - LOGD(">>>> ~ScriptC(mBCCScript)"); } free(mEnviroment.mScriptText); mEnviroment.mScriptText = NULL; @@ -589,6 +597,16 @@ bool ScriptCState::runCompiler(Context *rsc, return false; } } + + size_t objectSlotCount = bccGetObjectSlotCount(s->mBccScript); + uint32_t *objectSlots = NULL; + if (objectSlotCount) { + objectSlots = new uint32_t[objectSlotCount]; + bccGetObjectSlotList(s->mBccScript, objectSlotCount, objectSlots); + s->mProgram.mObjectSlotList = objectSlots; + s->mProgram.mObjectSlotCount = objectSlotCount; + } + return true; } diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h index 7143c67..e794feb 100644 --- a/libs/rs/rsScriptC.h +++ b/libs/rs/rsScriptC.h @@ -42,8 +42,12 @@ public: RunScript_t mRoot; VoidFunc_t mInit; + + uint32_t * mObjectSlotList; + uint32_t mObjectSlotCount; }; + Program_t mProgram; BCCScriptRef mBccScript; |
