/* * Thread-safe fftw * Copyright (C) 2018-2019 Filipe Coelho * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * For a full copy of the GNU General Public License see the doc/GPL.txt file. */ #ifndef THREAD_SAFE_FFTW_HPP_INCLUDED #define THREAD_SAFE_FFTW_HPP_INCLUDED #include "CarlaDefines.h" #ifdef CARLA_OS_UNIX // -------------------------------------------------------------------------------------------------------------------- // Thread-safe fftw #include "CarlaLibUtils.hpp" class ThreadSafeFFTW { public: typedef void (*void_func)(void); struct Deinitializer { Deinitializer(ThreadSafeFFTW& s) : tsfftw(s) {} ~Deinitializer() { tsfftw.deinit(); } ThreadSafeFFTW& tsfftw; }; ThreadSafeFFTW() : initialized(false), libfftw3(nullptr), libfftw3f(nullptr), libfftw3l(nullptr), libfftw3q(nullptr) {} ~ThreadSafeFFTW() { CARLA_SAFE_ASSERT(libfftw3 == nullptr); } void init() { if (initialized) return; initialized = true; if ((libfftw3 = lib_open("libfftw3_threads.so.3")) != nullptr) if (const void_func func = lib_symbol(libfftw3, "fftw_make_planner_thread_safe")) func(); if ((libfftw3f = lib_open("libfftw3f_threads.so.3")) != nullptr) if (const void_func func = lib_symbol(libfftw3f, "fftwf_make_planner_thread_safe")) func(); if ((libfftw3l = lib_open("libfftw3l_threads.so.3")) != nullptr) if (const void_func func = lib_symbol(libfftw3l, "fftwl_make_planner_thread_safe")) func(); if ((libfftw3q = lib_open("libfftw3q_threads.so.3")) != nullptr) if (const void_func func = lib_symbol(libfftw3q, "fftwq_make_planner_thread_safe")) func(); } void deinit() { if (! initialized) return; initialized = false; if (libfftw3 != nullptr) { lib_close(libfftw3); libfftw3 = nullptr; } if (libfftw3f != nullptr) { lib_close(libfftw3f); libfftw3f = nullptr; } if (libfftw3l != nullptr) { lib_close(libfftw3l); libfftw3l = nullptr; } if (libfftw3q != nullptr) { lib_close(libfftw3q); libfftw3q = nullptr; } } private: bool initialized; lib_t libfftw3; lib_t libfftw3f; lib_t libfftw3l; lib_t libfftw3q; CARLA_DECLARE_NON_COPY_CLASS(ThreadSafeFFTW) }; #endif // -------------------------------------------------------------------------------------------------------------------- #endif // THREAD_SAFE_FFTW_HPP_INCLUDED