Fix clear() operation for rsScriptC.
- This removes a memory leak where some elements were not getting tracked
properly (and then triggering an assert when a context is destroyed).
- Convert ScriptCState to use a tracked object reference for mScript.
- Add a missing clear to FontState.
- Clean up synchronization in RSTest so that our graphics context outlives
any subtest context.
Change-Id: I0d5768c4d2f8810dd1ae2f68b1edd7e150f382fd
diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp
index e9621b9..c6418be 100644
--- a/libs/rs/rsScriptC.cpp
+++ b/libs/rs/rsScriptC.cpp
@@ -349,25 +349,29 @@
ScriptCState::ScriptCState()
{
- mScript = NULL;
- clear();
+ mScript.clear();
}
ScriptCState::~ScriptCState()
{
- delete mScript;
- mScript = NULL;
+ mScript.clear();
}
-void ScriptCState::clear()
+void ScriptCState::init(Context *rsc)
{
+ clear(rsc);
+}
+
+void ScriptCState::clear(Context *rsc)
+{
+ rsAssert(rsc);
for (uint32_t ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
mConstantBufferTypes[ct].clear();
mSlotWritable[ct] = false;
}
- delete mScript;
- mScript = new ScriptC(NULL);
+ mScript.clear();
+ mScript.set(new ScriptC(rsc));
}
static BCCvoid* symbolLookup(BCCvoid* pContext, const BCCchar* name)
@@ -503,7 +507,7 @@
void rsi_ScriptCBegin(Context * rsc)
{
ScriptCState *ss = &rsc->mScriptC;
- ss->clear();
+ ss->clear(rsc);
}
void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
@@ -522,10 +526,10 @@
{
ScriptCState *ss = &rsc->mScriptC;
- ScriptC *s = ss->mScript;
- ss->mScript = NULL;
+ ObjectBaseRef<ScriptC> s = ss->mScript.get();
+ ss->mScript.clear();
- ss->runCompiler(rsc, s);
+ ss->runCompiler(rsc, s.get());
s->incUserRef();
s->setContext(rsc);
for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
@@ -533,8 +537,8 @@
s->mSlotWritable[ct] = ss->mSlotWritable[ct];
}
- ss->clear();
- return s;
+ ss->clear(rsc);
+ return s.get();
}
}