tdf#100883 - opencl impls. that use SEH are still bad.

Amazingly we fell-back to the old calculation path for
crashes in older LibreOffices, might as well have this on master.

Change-Id: Ifc1de41c93329207d7a1917c736e361d840c2821
Reviewed-on: https://gerrit.libreoffice.org/27166
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
This commit is contained in:
Michael Meeks
2016-07-12 19:30:53 +01:00
parent 37204431c6
commit e9a1afbd3e
4 changed files with 21 additions and 0 deletions

View File

@@ -46,6 +46,8 @@ bool testOpenCLCompute(const Reference< XDesktop2 > &xDesktop, const OUString &r
bool bSuccess = false; bool bSuccess = false;
css::uno::Reference< css::lang::XComponent > xComponent; css::uno::Reference< css::lang::XComponent > xComponent;
sal_uInt64 nKernelFailures = opencl::kernelFailures;
SAL_INFO("opencl", "Starting CL test spreadsheet"); SAL_INFO("opencl", "Starting CL test spreadsheet");
try { try {
@@ -95,11 +97,21 @@ bool testOpenCLCompute(const Reference< XDesktop2 > &xDesktop, const OUString &r
SAL_WARN("opencl", "OpenCL testing failed - disabling: " << e.Message); SAL_WARN("opencl", "OpenCL testing failed - disabling: " << e.Message);
} }
if (nKernelFailures != opencl::kernelFailures)
{
// tdf#100883 - defeat SEH exception handling fallbacks.
SAL_WARN("opencl", "OpenCL kernels failed to compile, "
"or took SEH exceptions "
<< nKernelFailures << " != " << opencl::kernelFailures);
bSuccess = false;
}
if (!bSuccess) if (!bSuccess)
OpenCLZone::hardDisable(); OpenCLZone::hardDisable();
if (xComponent.is()) if (xComponent.is())
xComponent->dispose(); xComponent->dispose();
return bSuccess; return bSuccess;
} }

View File

@@ -53,6 +53,7 @@ struct OPENCL_DLLPUBLIC GPUEnv
}; };
extern OPENCL_DLLPUBLIC GPUEnv gpuEnv; extern OPENCL_DLLPUBLIC GPUEnv gpuEnv;
extern OPENCL_DLLPUBLIC sal_uInt64 kernelFailures;
OPENCL_DLLPUBLIC bool generatBinFromKernelSource( cl_program program, const char * clFileName ); OPENCL_DLLPUBLIC bool generatBinFromKernelSource( cl_program program, const char * clFileName );
OPENCL_DLLPUBLIC bool buildProgramFromBinary(const char* buildOption, GPUEnv* gpuEnv, const char* filename, int idx); OPENCL_DLLPUBLIC bool buildProgramFromBinary(const char* buildOption, GPUEnv* gpuEnv, const char* filename, int idx);

View File

@@ -58,6 +58,7 @@ using namespace std;
namespace opencl { namespace opencl {
GPUEnv gpuEnv; GPUEnv gpuEnv;
sal_uInt64 kernelFailures = 0;
namespace { namespace {

View File

@@ -4059,6 +4059,7 @@ DynamicKernel* DynamicKernel::create( const ScCalcConfig& rConfig, ScTokenArray&
// OpenCLError used to go to the catch-all below, and not delete pDynamicKernel. Was that // OpenCLError used to go to the catch-all below, and not delete pDynamicKernel. Was that
// intentional, should we not do it here then either? // intentional, should we not do it here then either?
delete pDynamicKernel; delete pDynamicKernel;
::opencl::kernelFailures++;
return nullptr; return nullptr;
} }
catch (const Unhandled& uh) catch (const Unhandled& uh)
@@ -4068,6 +4069,7 @@ DynamicKernel* DynamicKernel::create( const ScCalcConfig& rConfig, ScTokenArray&
// Unhandled used to go to the catch-all below, and not delete pDynamicKernel. Was that // Unhandled used to go to the catch-all below, and not delete pDynamicKernel. Was that
// intentional, should we not do it here then either? // intentional, should we not do it here then either?
delete pDynamicKernel; delete pDynamicKernel;
::opencl::kernelFailures++;
return nullptr; return nullptr;
} }
catch (...) catch (...)
@@ -4075,6 +4077,7 @@ DynamicKernel* DynamicKernel::create( const ScCalcConfig& rConfig, ScTokenArray&
// FIXME: Do we really want to catch random exceptions here? // FIXME: Do we really want to catch random exceptions here?
SAL_WARN("sc.opencl", "Dynamic formula compiler: unexpected exception"); SAL_WARN("sc.opencl", "Dynamic formula compiler: unexpected exception");
// FIXME: Not deleting pDynamicKernel here!?, is that intentional? // FIXME: Not deleting pDynamicKernel here!?, is that intentional?
::opencl::kernelFailures++;
return nullptr; return nullptr;
} }
return pDynamicKernel; return pDynamicKernel;
@@ -4185,21 +4188,25 @@ public:
catch (const UnhandledToken& ut) catch (const UnhandledToken& ut)
{ {
SAL_INFO("sc.opencl", "Dynamic formula compiler: UnhandledToken: " << ut.mMessage << " at " << ut.mFile << ":" << ut.mLineNumber); SAL_INFO("sc.opencl", "Dynamic formula compiler: UnhandledToken: " << ut.mMessage << " at " << ut.mFile << ":" << ut.mLineNumber);
::opencl::kernelFailures++;
return CLInterpreterResult(); return CLInterpreterResult();
} }
catch (const OpenCLError& oce) catch (const OpenCLError& oce)
{ {
SAL_WARN("sc.opencl", "Dynamic formula compiler: OpenCLError from " << oce.mFunction << ": " << ::opencl::errorString(oce.mError) << " at " << oce.mFile << ":" << oce.mLineNumber); SAL_WARN("sc.opencl", "Dynamic formula compiler: OpenCLError from " << oce.mFunction << ": " << ::opencl::errorString(oce.mError) << " at " << oce.mFile << ":" << oce.mLineNumber);
::opencl::kernelFailures++;
return CLInterpreterResult(); return CLInterpreterResult();
} }
catch (const Unhandled& uh) catch (const Unhandled& uh)
{ {
SAL_INFO("sc.opencl", "Dynamic formula compiler: Unhandled at " << uh.mFile << ":" << uh.mLineNumber); SAL_INFO("sc.opencl", "Dynamic formula compiler: Unhandled at " << uh.mFile << ":" << uh.mLineNumber);
::opencl::kernelFailures++;
return CLInterpreterResult(); return CLInterpreterResult();
} }
catch (...) catch (...)
{ {
SAL_WARN("sc.opencl", "Dynamic formula compiler: unexpected exception"); SAL_WARN("sc.opencl", "Dynamic formula compiler: unexpected exception");
::opencl::kernelFailures++;
return CLInterpreterResult(); return CLInterpreterResult();
} }