From 514f9790fdf180ca3c58e508cbd36c520fa7be08 Mon Sep 17 00:00:00 2001 From: Stephen Hines Date: Wed, 31 Aug 2011 17:41:39 -0700 Subject: Call .rs.dtor() when tearing down Scripts. BUG=5186750 This allows us to properly reference count any globals (static or extern) that need to potentially be cleaned up. Change-Id: I03d2c38c1e7a4ca96c40003d2eeecb6f395d5835 --- libs/rs/driver/rsdBcc.cpp | 9 +++++++++ libs/rs/driver/rsdBcc.h | 2 ++ libs/rs/driver/rsdCore.cpp | 1 + libs/rs/rsScript.cpp | 6 ++++++ libs/rs/rsScript.h | 2 ++ libs/rs/rs_hal.h | 1 + 6 files changed, 21 insertions(+) (limited to 'libs/rs') diff --git a/libs/rs/driver/rsdBcc.cpp b/libs/rs/driver/rsdBcc.cpp index 44ea79c..0755fb7 100644 --- a/libs/rs/driver/rsdBcc.cpp +++ b/libs/rs/driver/rsdBcc.cpp @@ -37,6 +37,7 @@ using namespace android::renderscript; struct DrvScript { int (*mRoot)(); void (*mInit)(); + void (*mFreeChildren)(); BCCScriptRef mBccScript; @@ -125,6 +126,7 @@ bool rsdScriptInit(const Context *rsc, drv->mRoot = reinterpret_cast(bccGetFuncAddr(drv->mBccScript, "root")); drv->mInit = reinterpret_cast(bccGetFuncAddr(drv->mBccScript, "init")); + drv->mFreeChildren = reinterpret_cast(bccGetFuncAddr(drv->mBccScript, ".rs.dtor")); exportFuncCount = drv->ME->getExportFuncCount(); if (exportFuncCount > 0) { @@ -430,6 +432,13 @@ void rsdScriptInvokeInit(const Context *dc, Script *script) { } } +void rsdScriptInvokeFreeChildren(const Context *dc, Script *script) { + DrvScript *drv = (DrvScript *)script->mHal.drv; + + if (drv->mFreeChildren) { + drv->mFreeChildren(); + } +} void rsdScriptInvokeFunction(const Context *dc, Script *script, uint32_t slot, diff --git a/libs/rs/driver/rsdBcc.h b/libs/rs/driver/rsdBcc.h index 67929bc..5f83ed2 100644 --- a/libs/rs/driver/rsdBcc.h +++ b/libs/rs/driver/rsdBcc.h @@ -43,6 +43,8 @@ int rsdScriptInvokeRoot(const android::renderscript::Context *dc, android::renderscript::Script *script); void rsdScriptInvokeInit(const android::renderscript::Context *dc, android::renderscript::Script *script); +void rsdScriptInvokeFreeChildren(const android::renderscript::Context *dc, + android::renderscript::Script *script); void rsdScriptSetGlobalVar(const android::renderscript::Context *, const android::renderscript::Script *, diff --git a/libs/rs/driver/rsdCore.cpp b/libs/rs/driver/rsdCore.cpp index 171d045..a38fff7 100644 --- a/libs/rs/driver/rsdCore.cpp +++ b/libs/rs/driver/rsdCore.cpp @@ -60,6 +60,7 @@ static RsdHalFunctions FunctionTable = { rsdScriptInvokeRoot, rsdScriptInvokeForEach, rsdScriptInvokeInit, + rsdScriptInvokeFreeChildren, rsdScriptSetGlobalVar, rsdScriptSetGlobalBind, rsdScriptSetGlobalObj, diff --git a/libs/rs/rsScript.cpp b/libs/rs/rsScript.cpp index f62c72e..93513fe 100644 --- a/libs/rs/rsScript.cpp +++ b/libs/rs/rsScript.cpp @@ -72,6 +72,12 @@ void Script::setVarObj(uint32_t slot, ObjectBase *val) { mRSC->mHal.funcs.script.setGlobalObj(mRSC, this, slot, val); } +bool Script::freeChildren() { + incSysRef(); + mRSC->mHal.funcs.script.invokeFreeChildren(mRSC, this); + return decSysRef(); +} + namespace android { namespace renderscript { diff --git a/libs/rs/rsScript.h b/libs/rs/rsScript.h index c0324dd..d645421 100644 --- a/libs/rs/rsScript.h +++ b/libs/rs/rsScript.h @@ -73,6 +73,8 @@ public: void setVar(uint32_t slot, const void *val, size_t len); void setVarObj(uint32_t slot, ObjectBase *val); + virtual bool freeChildren(); + virtual void runForEach(Context *rsc, const Allocation * ain, Allocation * aout, diff --git a/libs/rs/rs_hal.h b/libs/rs/rs_hal.h index 21dff21..b8d7351 100644 --- a/libs/rs/rs_hal.h +++ b/libs/rs/rs_hal.h @@ -90,6 +90,7 @@ typedef struct { uint32_t usrLen, const RsScriptCall *sc); void (*invokeInit)(const Context *rsc, Script *s); + void (*invokeFreeChildren)(const Context *rsc, Script *s); void (*setGlobalVar)(const Context *rsc, const Script *s, uint32_t slot, -- cgit v1.1