Correctly free resouces bound to scripts when the scripts are deleted.
Change-Id: Idfcc30f1a7de0badeb6d8254ed508938d89f4070
b: 3381615
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::destroyWorkerThreadResources() {
//LOGV("destroyWorkerThreadResources 1");
+ ObjectBase::zeroAllUserRef(this);
if (mIsGraphicsContext) {
mRaster.clear();
mFragment.clear();
@@ -542,7 +543,6 @@
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 @@
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 @@
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 @@
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 @@
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 @@
(*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 @@
}
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 @@
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 @@
RunScript_t mRoot;
VoidFunc_t mInit;
+
+ uint32_t * mObjectSlotList;
+ uint32_t mObjectSlotCount;
};
+
Program_t mProgram;
BCCScriptRef mBccScript;