From 9d5e03db9929271f56ac4a0078d9474d7011efcd Mon Sep 17 00:00:00 2001 From: Jason Sams Date: Tue, 3 Nov 2009 11:25:42 -0800 Subject: [PATCH] Fix RS bugs. We were holding a pointer to the script text from the java vm. Move freeing of objects to before context teardown to allow allocations to clean up their data. --- libs/rs/rsAllocation.cpp | 11 +++++++++++ libs/rs/rsContext.cpp | 5 +++-- libs/rs/rsObjectBase.cpp | 7 +------ libs/rs/rsScript.h | 2 +- libs/rs/rsScriptC.cpp | 8 +++++++- libs/rs/rsScriptC.h | 4 ---- 6 files changed, 23 insertions(+), 14 deletions(-) diff --git a/libs/rs/rsAllocation.cpp b/libs/rs/rsAllocation.cpp index 2cbfe17d40a9d..38cec64e3753e 100644 --- a/libs/rs/rsAllocation.cpp +++ b/libs/rs/rsAllocation.cpp @@ -54,6 +54,17 @@ Allocation::~Allocation() { free(mPtr); mPtr = NULL; + + if (mBufferID) { + // Causes a SW crash.... + //LOGV(" mBufferID %i", mBufferID); + //glDeleteBuffers(1, &mBufferID); + //mBufferID = 0; + } + if (mTextureID) { + glDeleteTextures(1, &mTextureID); + mTextureID = 0; + } } void Allocation::setCpuWritable(bool) diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index 961ec0b2709cb..2e6d7b0c09433 100644 --- a/libs/rs/rsContext.cpp +++ b/libs/rs/rsContext.cpp @@ -342,6 +342,9 @@ void * Context::threadProc(void *vrsc) rsc->mStateFragmentStore.deinit(rsc); ObjectBase::zeroAllUserRef(rsc); + rsc->mObjDestroy.mNeedToEmpty = true; + rsc->objDestroyOOBRun(); + glClearColor(0,0,0,0); glClear(GL_COLOR_BUFFER_BIT); eglSwapBuffers(rsc->mEGL.mDisplay, rsc->mEGL.mSurface); @@ -350,8 +353,6 @@ void * Context::threadProc(void *vrsc) rsc->deinitEGL(); pthread_mutex_unlock(&gInitMutex); - rsc->mObjDestroy.mNeedToEmpty = true; - rsc->objDestroyOOBRun(); LOGV("RS Thread exited"); return NULL; } diff --git a/libs/rs/rsObjectBase.cpp b/libs/rs/rsObjectBase.cpp index 1b442ba39a7e0..b7d67cca4b3c2 100644 --- a/libs/rs/rsObjectBase.cpp +++ b/libs/rs/rsObjectBase.cpp @@ -113,12 +113,7 @@ bool ObjectBase::decSysRef() const void ObjectBase::setName(const char *name) { - delete mName; - mName = NULL; - if (name) { - mName = new char[strlen(name) +1]; - strcpy(mName, name); - } + setName(name, strlen(name)); } void ObjectBase::setName(const char *name, uint32_t len) diff --git a/libs/rs/rsScript.h b/libs/rs/rsScript.h index 8aa45423c7746..bc4085429fd94 100644 --- a/libs/rs/rsScript.h +++ b/libs/rs/rsScript.h @@ -54,7 +54,7 @@ public: ObjectBaseRef mRaster; ObjectBaseRef mFragmentStore; InvokeFunc_t mInvokables[MAX_SCRIPT_BANKS]; - const char * mScriptText; + char * mScriptText; uint32_t mScriptTextLength; }; Enviroment_t mEnviroment; diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp index 9da7766217b61..073d98bf4e1b3 100644 --- a/libs/rs/rsScriptC.cpp +++ b/libs/rs/rsScriptC.cpp @@ -46,6 +46,8 @@ ScriptC::~ScriptC() if (mAccScript) { accDeleteScript(mAccScript); } + free(mEnviroment.mScriptText); + mEnviroment.mScriptText = NULL; } void ScriptC::setupScript() @@ -404,7 +406,11 @@ void rsi_ScriptCSetScript(Context * rsc, void *vp) void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len) { ScriptCState *ss = &rsc->mScriptC; - ss->mScript->mEnviroment.mScriptText = text; + + char *t = (char *)malloc(len + 1); + memcpy(t, text, len); + t[len] = 0; + ss->mScript->mEnviroment.mScriptText = t; ss->mScript->mEnviroment.mScriptTextLength = len; } diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h index ae124b45e741d..69afc18bc9b6f 100644 --- a/libs/rs/rsScriptC.h +++ b/libs/rs/rsScriptC.h @@ -41,10 +41,6 @@ public: virtual ~ScriptC(); struct Program_t { - const char * mScriptText; - uint32_t mScriptTextLength; - - int mVersionMajor; int mVersionMinor;