diff options
author | Tor Lillqvist <tml@collabora.com> | 2013-11-18 17:59:30 +0200 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2013-11-20 18:23:06 +0000 |
commit | 94544378e5fcee7de5b481a9f06d7ef4a821d107 (patch) | |
tree | d30bfc361b3e38a0fb0e0c6cd94b568414021868 /sc | |
parent | 2f98f0ecf8964f5fce8e315fbff29760aa6449dd (diff) |
Fix some life-cycle issues for backgroup OpenCL kernel compilation
Now it no longer asserts or crashes in light testing, but it doesn't
properly recalculate either.
Change-Id: I7dc117341eff5ac1b21d7400122cc6e04ae2baf7
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/core/data/formulacell.cxx | 2 | ||||
-rw-r--r-- | sc/source/core/inc/dynamickernel.hxx | 5 | ||||
-rw-r--r-- | sc/source/core/opencl/formulagroupcl.cxx | 16 |
3 files changed, 15 insertions, 8 deletions
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx index 1fbe8956c40e..f7b001bd9521 100644 --- a/sc/source/core/data/formulacell.cxx +++ b/sc/source/core/data/formulacell.cxx @@ -1769,7 +1769,7 @@ void ScFormulaCell::SetDirty( bool bDirtyFlag ) void ScFormulaCell::SetDirtyVar() { bDirty = true; - if (mxGroup) + if (mxGroup && mxGroup->meCalcState == sc::GroupCalcRunning) mxGroup->meCalcState = sc::GroupCalcEnabled; // mark the sheet of this cell to be calculated diff --git a/sc/source/core/inc/dynamickernel.hxx b/sc/source/core/inc/dynamickernel.hxx index a3908734e044..dd4d516e4e92 100644 --- a/sc/source/core/inc/dynamickernel.hxx +++ b/sc/source/core/inc/dynamickernel.hxx @@ -63,7 +63,7 @@ class DynamicKernel : public CompiledFormula { public: DynamicKernel(FormulaTreeNodeRef r):mpRoot(r), - mpProgram(NULL), mpKernel(NULL), mpResClmem(NULL) {} + mpProgram(NULL), mpKernel(NULL), mpResClmem(NULL), mpCode(NULL) {} static DynamicKernel *create(ScDocument& rDoc, const ScAddress& rTopPos, ScTokenArray& rCode); @@ -80,6 +80,8 @@ public: void Launch(size_t nr); ~DynamicKernel(); cl_mem GetResultBuffer(void) const { return mpResClmem; } + void SetPCode(ScTokenArray *pCode) { mpCode = pCode; } + private: void TraverseAST(FormulaTreeNodeRef); FormulaTreeNodeRef mpRoot; @@ -91,6 +93,7 @@ private: cl_mem mpResClmem; // Results std::set<std::string> inlineDecl; std::set<std::string> inlineFun; + ScTokenArray *mpCode; }; } diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx index 6b0f2b72257b..cd1ca5ed33ed 100644 --- a/sc/source/core/opencl/formulagroupcl.cxx +++ b/sc/source/core/opencl/formulagroupcl.cxx @@ -57,7 +57,6 @@ namespace sc { namespace opencl { size_t VectorRef::Marshal(cl_kernel k, int argno, int, cl_program) { FormulaToken *ref = mFormulaTree->GetFormulaToken(); - assert(mpClmem == NULL); double *pHostBuffer = NULL; size_t szHostBuffer = 0; if (ref->GetType() == formula::svSingleVectorRef) { @@ -311,7 +310,6 @@ public: size_t DynamicKernelStringArgument::Marshal(cl_kernel k, int argno, int, cl_program) { FormulaToken *ref = mFormulaTree->GetFormulaToken(); - assert(mpClmem == NULL); // Obtain cl context KernelEnv kEnv; OpenclDevice::setKernelEnv(&kEnv); @@ -2501,6 +2499,8 @@ DynamicKernel::~DynamicKernel() std::cerr<<"Freeing kernel "<< GetMD5() << " program\n"; clReleaseProgram(mpProgram); } + if (mpCode) + delete mpCode; } /// Build code void DynamicKernel::CreateKernel(void) @@ -2656,14 +2656,16 @@ CompiledFormula* FormulaGroupInterpreterOpenCL::createCompiledFormula(ScDocument ScFormulaCellGroupRef& xGroup, ScTokenArray& rCode) { - ScTokenArray aCode; - ScGroupTokenConverter aConverter(aCode, rDoc, *xGroup->mpTopCell, rTopPos); + ScTokenArray *pCode = new ScTokenArray(); + ScGroupTokenConverter aConverter(*pCode, rDoc, *xGroup->mpTopCell, rTopPos); if (!aConverter.convert(rCode)) { return NULL; } - return DynamicKernel::create(rDoc, rTopPos, aCode); + DynamicKernel *result = DynamicKernel::create(rDoc, rTopPos, *pCode); + result->SetPCode(pCode); + return result; } bool FormulaGroupInterpreterOpenCL::interpret( ScDocument& rDoc, @@ -2691,6 +2693,7 @@ bool FormulaGroupInterpreterOpenCL::interpret( ScDocument& rDoc, } else { + assert(xGroup->meCalcState == sc::GroupCalcRunning); aGuard.clear(); pKernel = static_cast<DynamicKernel*>(createCompiledFormula(rDoc, rTopPos, xGroup, rCode)); } @@ -2718,7 +2721,8 @@ bool FormulaGroupInterpreterOpenCL::interpret( ScDocument& rDoc, err = clEnqueueUnmapMemObject(kEnv.mpkCmdQueue, res, resbuf, 0, NULL, NULL); if (err != CL_SUCCESS) throw OpenCLError(err); - delete pKernel; + if (xGroup->meCalcState == sc::GroupCalcRunning) + delete pKernel; } catch (const UnhandledToken &ut) { std::cerr << "\nDynamic formual compiler: unhandled token: "; |