summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorTor Lillqvist <tml@collabora.com>2013-11-18 17:59:30 +0200
committerMichael Meeks <michael.meeks@collabora.com>2013-11-20 18:23:06 +0000
commit94544378e5fcee7de5b481a9f06d7ef4a821d107 (patch)
treed30bfc361b3e38a0fb0e0c6cd94b568414021868 /sc
parent2f98f0ecf8964f5fce8e315fbff29760aa6449dd (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.cxx2
-rw-r--r--sc/source/core/inc/dynamickernel.hxx5
-rw-r--r--sc/source/core/opencl/formulagroupcl.cxx16
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: ";