Browse Source

Set fftw as thread-safe when starting standalone engine

tags/v1.9.11
falkTX 6 years ago
parent
commit
bb5a286b98
1 changed files with 59 additions and 0 deletions
  1. +59
    -0
      source/backend/CarlaStandalone.cpp

+ 59
- 0
source/backend/CarlaStandalone.cpp View File

@@ -27,6 +27,10 @@
#include "CarlaBackendUtils.hpp"
#include "CarlaBase64Utils.hpp"

#ifdef CARLA_OS_UNIX
# include "CarlaLibUtils.hpp"
#endif

#ifdef BUILD_BRIDGE
# include "water/files/File.h"
#else
@@ -85,6 +89,58 @@ struct CarlaBackendStandalone {

CarlaBackendStandalone gStandalone;

#ifdef CARLA_OS_UNIX
// --------------------------------------------------------------------------------------------------------------------
// Thread-safe fftw

typedef void (*void_func)(void);

class ThreadSafeFFTW
{
public:
ThreadSafeFFTW()
: libfftw3(lib_open("libfftw3_threads.so.3")),
libfftw3f(lib_open("libfftw3f_threads.so.3")),
libfftw3l(lib_open("libfftw3l_threads.so.3")),
libfftw3q(lib_open("libfftw3q_threads.so.3"))
{
if (libfftw3 != nullptr)
if (const void_func func = lib_symbol<void_func>(libfftw3, "fftw_make_planner_thread_safe"))
func();

if (libfftw3f != nullptr)
if (const void_func func = lib_symbol<void_func>(libfftw3f, "fftwf_make_planner_thread_safe"))
func();

if (libfftw3l != nullptr)
if (const void_func func = lib_symbol<void_func>(libfftw3l, "fftwl_make_planner_thread_safe"))
func();

if (libfftw3q != nullptr)
if (const void_func func = lib_symbol<void_func>(libfftw3q, "fftwq_make_planner_thread_safe"))
func();
}

~ThreadSafeFFTW()
{
if (libfftw3 != nullptr)
lib_close(libfftw3);
if (libfftw3f != nullptr)
lib_close(libfftw3f);
if (libfftw3l != nullptr)
lib_close(libfftw3l);
if (libfftw3q != nullptr)
lib_close(libfftw3q);
}

private:
lib_t libfftw3;
lib_t libfftw3f;
lib_t libfftw3l;
lib_t libfftw3q;
};
#endif

// --------------------------------------------------------------------------------------------------------------------
// API

@@ -293,6 +349,9 @@ bool carla_engine_init(const char* driverName, const char* clientName)
#ifdef CARLA_OS_WIN
carla_setenv("WINEASIO_CLIENT_NAME", clientName);
#endif
#ifdef CARLA_OS_UNIX
static const ThreadSafeFFTW tsfftw;
#endif

ScopedPointer<CarlaEngine> engine(CarlaEngine::newDriverByName(driverName));



Loading…
Cancel
Save