7

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
        }
    }
}

Cross posted to Wolfram Community.

Szabolcs
  • 234,956
  • 30
  • 623
  • 1,263
  • You have code in WolframLibrary_initialize; when is the code actually run? When I call up multiple functions with LibraryFunctionLoad, I find that the code in WolframLibrary_initialize is never really called. – QuantumDot Jun 25 '17 at 16:36
  • @QuantumDot I am travelling now, so I am answering from memory. It should run once when the library is first loaded. You do not need to use LibraryLoad to load it. In fact as I remember doing so had harmful effects (problems unloading?). LibraryLoad is only for loading dependencies. Instead use LibraryFunctionLoad only, as usual. The first time you load a function from the library, the initialization should run. – Szabolcs Jun 30 '17 at 04:57

1 Answers1

2

In several projects, I saved the value of libData at library initialization, and used the saved value throughout the lifetime of the library.

So far I have not encountered any problems. Of course that does not mean that there are none.

Szabolcs
  • 234,956
  • 30
  • 623
  • 1,263