summaryrefslogtreecommitdiff
path: root/rsScriptC.cpp
diff options
context:
space:
mode:
authorJason Sams <rjsams@android.com>2011-01-27 00:14:13 -0800
committerStephen Hines <srhines@google.com>2011-01-27 19:36:54 -0800
commit2e8665de7c0eb4514c67baf8693d61c892e5303d (patch)
tree9eb68ca9ef39c15465f95b5296e41d8e424eb3e9 /rsScriptC.cpp
parente31775b3eee19595335d62bcbe3ad699d1e7e656 (diff)
downloadrs-2e8665de7c0eb4514c67baf8693d61c892e5303d.tar.gz
Correctly free resouces bound to scripts when the scripts are deleted.
Change-Id: Idfcc30f1a7de0badeb6d8254ed508938d89f4070 b: 3381615
Diffstat (limited to 'rsScriptC.cpp')
-rw-r--r--rsScriptC.cpp24
1 files changed, 21 insertions, 3 deletions
diff --git a/rsScriptC.cpp b/rsScriptC.cpp
index 3858e1cf..fc673a2d 100644
--- a/rsScriptC.cpp
+++ b/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;
}