25#if ENABLE_THREAD_SAFE_FFTW
26 load_and_make_thread_safe (
27 "libfftw3_threads.so.3",
"fftw_make_planner_thread_safe");
28 load_and_make_thread_safe (
29 "libfftw3f_threads.so.3",
"fftwf_make_planner_thread_safe");
30 load_and_make_thread_safe (
31 "libfftw3l_threads.so.3",
"fftwl_make_planner_thread_safe");
32 load_and_make_thread_safe (
33 "libfftw3q_threads.so.3",
"fftwq_make_planner_thread_safe");
37 Z_DISABLE_COPY_MOVE (ThreadSafeFFTW)
40#if ENABLE_THREAD_SAFE_FFTW
41 struct LibHandleDeleter
43 void operator() (
void * handle)
const noexcept
50 using LibHandle = std::unique_ptr<void, LibHandleDeleter>;
52 void load_and_make_thread_safe (
const char * libname,
const char * funcname)
54 LibHandle lib (dlopen (libname, RTLD_LAZY));
58 using ThreadSafeFunc = void (*) ();
60 auto func =
reinterpret_cast<ThreadSafeFunc
> (dlsym (lib.get (), funcname)))