[Libreoffice-commits] core.git: Branch 'private/kohei/formula-opencl-work' - sc/source
Kohei Yoshida
kohei.yoshida at collabora.com
Wed Sep 11 09:33:12 PDT 2013
sc/source/core/opencl/formulagroupcl.cxx | 19 +++++----
sc/source/core/tool/formulagroup.cxx | 62 ++++++++++++++++++++++---------
2 files changed, 54 insertions(+), 27 deletions(-)
New commits:
commit 0b28477226793fca61edee5156c34d4879d7f0e3
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date: Wed Sep 11 12:33:02 2013 -0400
Dynamically load the opencl group interpreter code at run time.
Change-Id: I0e2b393ecf068b57bfe653663be0a788caa22a36
diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx
index dada7e0..d958b1b 100644
--- a/sc/source/core/opencl/formulagroupcl.cxx
+++ b/sc/source/core/opencl/formulagroupcl.cxx
@@ -27,9 +27,6 @@
namespace sc { namespace opencl {
-// A single public entry point for a factory function:
-extern sc::FormulaGroupInterpreter *createFormulaGroupInterpreter();
-
/////time test dbg
double getTimeDiff(const TimeValue& t1, const TimeValue& t2)
{
@@ -1067,21 +1064,25 @@ bool FormulaGroupInterpreterGroundwater::interpret(ScDocument& rDoc, const ScAdd
#endif
-sc::FormulaGroupInterpreter *createFormulaGroupInterpreter()
+} // namespace opencl
+
+} // namespace sc
+
+extern "C" {
+
+SAL_DLLPUBLIC_EXPORT sc::FormulaGroupInterpreter* SAL_CALL createFormulaGroupOpenCLInterpreter()
{
if (getenv("SC_SOFTWARE"))
return NULL;
#if USE_GROUNDWATER_INTERPRETER
if (getenv("SC_GROUNDWATER"))
- return new FormulaGroupInterpreterGroundwater();
+ return new sc::opencl::FormulaGroupInterpreterGroundwater();
#endif
- return new FormulaGroupInterpreterOpenCL();
+ return new sc::opencl::FormulaGroupInterpreterOpenCL();
}
-} // namespace opencl
-
-} // namespace sc
+}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/core/tool/formulagroup.cxx b/sc/source/core/tool/formulagroup.cxx
index 98ef4a9..3b929fa 100644
--- a/sc/source/core/tool/formulagroup.cxx
+++ b/sc/source/core/tool/formulagroup.cxx
@@ -27,6 +27,12 @@
#include <cstdio>
#endif
+#ifdef DISABLE_DYNLOADING
+
+extern sc::FormulaGroupInterpreter* SAL_CALL createFormulaGroupOpenCLInterpreter();
+
+#endif
+
namespace sc {
rtl_uString* FormulaGroupContext::intern( const OUString& rStr )
@@ -128,15 +134,6 @@ void fillMatrix( ScMatrix& rMat, size_t nCol, rtl_uString** pStrs, size_t nLen )
}
-class FormulaGroupInterpreterOpenCLMissing : public FormulaGroupInterpreter
-{
-public:
- FormulaGroupInterpreterOpenCLMissing() : FormulaGroupInterpreter() {}
- virtual ~FormulaGroupInterpreterOpenCLMissing() {}
- virtual ScMatrixRef inverseMatrix(const ScMatrix&) { return ScMatrixRef(); }
- virtual bool interpret(ScDocument&, const ScAddress&, const ScFormulaCellGroupRef&, ScTokenArray&) { return false; }
-};
-
ScMatrixRef FormulaGroupInterpreterSoftware::inverseMatrix(const ScMatrix& /*rMat*/)
{
return ScMatrixRef();
@@ -278,12 +275,6 @@ bool FormulaGroupInterpreterSoftware::interpret(ScDocument& rDoc, const ScAddres
return true;
}
-// TODO: load module, hook symbol out, check it works, UI on failure etc.
-namespace opencl {
- extern sc::FormulaGroupInterpreter *createFormulaGroupInterpreter();
-}
-FormulaGroupInterpreter *FormulaGroupInterpreter::msInstance = NULL;
-
#if USE_DUMMY_INTERPRETER
class FormulaGroupInterpreterDummy : public FormulaGroupInterpreter
{
@@ -322,8 +313,28 @@ public:
return true;
}
};
+
#endif
+#ifndef DISABLE_DYNLOADING
+
+class FormulaGroupInterpreterOpenCLMissing : public FormulaGroupInterpreter
+{
+public:
+ FormulaGroupInterpreterOpenCLMissing() : FormulaGroupInterpreter() {}
+ virtual ~FormulaGroupInterpreterOpenCLMissing() {}
+ virtual ScMatrixRef inverseMatrix(const ScMatrix&) { return ScMatrixRef(); }
+ virtual bool interpret(ScDocument&, const ScAddress&, const ScFormulaCellGroupRef&, ScTokenArray&) { return false; }
+};
+
+static void SAL_CALL thisModule() {}
+
+typedef FormulaGroupInterpreter* (*LoaderFn)(void);
+
+#endif
+
+FormulaGroupInterpreter *FormulaGroupInterpreter::msInstance = NULL;
+
/// load and/or configure the correct formula group interpreter
FormulaGroupInterpreter *FormulaGroupInterpreter::getStatic()
{
@@ -351,10 +362,25 @@ FormulaGroupInterpreter *FormulaGroupInterpreter::getStatic()
if ( ScInterpreter::GetGlobalConfig().mbOpenCLEnabled )
{
#ifdef DISABLE_DYNLOADING
- msInstance = sc::opencl::createFormulaGroupInterpreter();
+ msInstance = createFormulaGroupOpenCLInterpreter();
#else
- // TODO : Dynamically load scopencl shared object, and instantiate the opencl interpreter.
- msInstance = new sc::FormulaGroupInterpreterOpenCLMissing();
+ // Dynamically load scopencl shared object, and instantiate the opencl interpreter.
+
+ OUString aLibName(SVLIBRARY("scopencl"));
+ static osl::Module aModule;
+ bool bLoaded = aModule.loadRelative(&thisModule, aLibName);
+ if (!bLoaded)
+ bLoaded = aModule.load(aLibName);
+
+ if (bLoaded)
+ {
+ oslGenericFunction fn = aModule.getFunctionSymbol("createFormulaGroupOpenCLInterpreter");
+ if (fn)
+ msInstance = reinterpret_cast<LoaderFn>(fn)();
+ }
+
+ if (!msInstance)
+ msInstance = new sc::FormulaGroupInterpreterOpenCLMissing();
#endif
}
#endif
More information about the Libreoffice-commits
mailing list