I am writing some C++ code that I want to call both through LibraryLink and independently from Mathematica. Thus it must be compatible with LibraryLink but not depend on it.
When calling it from Mathematica, I want to make it abortable.
All LibraryLink functions take an argument WolframLibraryData libData
(this is really a pointer). AbortQ
is called through it.
Question: Is it safe to cache the value of libData
in a global variable, never change it after WolframLibrary_initialize
, and use this global variable for calling all LibraryLink functions?
To make the question clearer, this is the layout of my code:
WolframLibraryData libData; // global variable
EXTERN_C DLLEXPORT int WolframLibrary_initialize(WolframLibraryData iLibData) {
libData = iLibData;
return LIBRARY_NO_ERROR;
}
class MyClass
{
public:
void simulate() {
for (...) { // long loop
...
#ifdef WolframLibraryVersion // use the global libData here:
if (libData->AbortQ) { /* abort computation */ }
#endif
}
}
}
WolframLibrary_initialize
; when is the code actually run? When I call up multiple functions withLibraryFunctionLoad
, I find that the code inWolframLibrary_initialize
is never really called. $\endgroup$LibraryLoad
to load it. In fact as I remember doing so had harmful effects (problems unloading?).LibraryLoad
is only for loading dependencies. Instead useLibraryFunctionLoad
only, as usual. The first time you load a function from the library, the initialization should run. $\endgroup$