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:
parent
37204431c6
commit
e9a1afbd3e
@ -46,6 +46,8 @@ bool testOpenCLCompute(const Reference< XDesktop2 > &xDesktop, const OUString &r
|
||||
bool bSuccess = false;
|
||||
css::uno::Reference< css::lang::XComponent > xComponent;
|
||||
|
||||
sal_uInt64 nKernelFailures = opencl::kernelFailures;
|
||||
|
||||
SAL_INFO("opencl", "Starting CL test spreadsheet");
|
||||
|
||||
try {
|
||||
@ -95,11 +97,21 @@ bool testOpenCLCompute(const Reference< XDesktop2 > &xDesktop, const OUString &r
|
||||
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)
|
||||
OpenCLZone::hardDisable();
|
||||
if (xComponent.is())
|
||||
xComponent->dispose();
|
||||
|
||||
|
||||
return bSuccess;
|
||||
}
|
||||
|
||||
|
@ -53,6 +53,7 @@ struct OPENCL_DLLPUBLIC 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 buildProgramFromBinary(const char* buildOption, GPUEnv* gpuEnv, const char* filename, int idx);
|
||||
|
@ -58,6 +58,7 @@ using namespace std;
|
||||
namespace opencl {
|
||||
|
||||
GPUEnv gpuEnv;
|
||||
sal_uInt64 kernelFailures = 0;
|
||||
|
||||
namespace {
|
||||
|
||||
|
@ -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
|
||||
// intentional, should we not do it here then either?
|
||||
delete pDynamicKernel;
|
||||
::opencl::kernelFailures++;
|
||||
return nullptr;
|
||||
}
|
||||
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
|
||||
// intentional, should we not do it here then either?
|
||||
delete pDynamicKernel;
|
||||
::opencl::kernelFailures++;
|
||||
return nullptr;
|
||||
}
|
||||
catch (...)
|
||||
@ -4075,6 +4077,7 @@ DynamicKernel* DynamicKernel::create( const ScCalcConfig& rConfig, ScTokenArray&
|
||||
// FIXME: Do we really want to catch random exceptions here?
|
||||
SAL_WARN("sc.opencl", "Dynamic formula compiler: unexpected exception");
|
||||
// FIXME: Not deleting pDynamicKernel here!?, is that intentional?
|
||||
::opencl::kernelFailures++;
|
||||
return nullptr;
|
||||
}
|
||||
return pDynamicKernel;
|
||||
@ -4185,21 +4188,25 @@ public:
|
||||
catch (const UnhandledToken& ut)
|
||||
{
|
||||
SAL_INFO("sc.opencl", "Dynamic formula compiler: UnhandledToken: " << ut.mMessage << " at " << ut.mFile << ":" << ut.mLineNumber);
|
||||
::opencl::kernelFailures++;
|
||||
return CLInterpreterResult();
|
||||
}
|
||||
catch (const OpenCLError& oce)
|
||||
{
|
||||
SAL_WARN("sc.opencl", "Dynamic formula compiler: OpenCLError from " << oce.mFunction << ": " << ::opencl::errorString(oce.mError) << " at " << oce.mFile << ":" << oce.mLineNumber);
|
||||
::opencl::kernelFailures++;
|
||||
return CLInterpreterResult();
|
||||
}
|
||||
catch (const Unhandled& uh)
|
||||
{
|
||||
SAL_INFO("sc.opencl", "Dynamic formula compiler: Unhandled at " << uh.mFile << ":" << uh.mLineNumber);
|
||||
::opencl::kernelFailures++;
|
||||
return CLInterpreterResult();
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
SAL_WARN("sc.opencl", "Dynamic formula compiler: unexpected exception");
|
||||
::opencl::kernelFailures++;
|
||||
return CLInterpreterResult();
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user