diff options
author | Jason Sams <rjsams@android.com> | 2011-01-27 00:14:13 -0800 |
---|---|---|
committer | Stephen Hines <srhines@google.com> | 2011-01-27 19:36:54 -0800 |
commit | 2e8665de7c0eb4514c67baf8693d61c892e5303d (patch) | |
tree | 9eb68ca9ef39c15465f95b5296e41d8e424eb3e9 /rsScriptC.cpp | |
parent | e31775b3eee19595335d62bcbe3ad699d1e7e656 (diff) | |
download | rs-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.cpp | 24 |
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; } |