From 8b8ce3055eeb3b78230a45bbc327e1bac26d2f74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=8B=D1=87=D0=BA=D0=BE=D0=B2=20=D0=90=D0=BD=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D0=B9?= Date: Fri, 31 Mar 2017 17:09:03 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/pip@329 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5 --- src/math/pifft.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/math/pifft.h b/src/math/pifft.h index acf1ae33..cee59c35 100644 --- a/src/math/pifft.h +++ b/src/math/pifft.h @@ -127,6 +127,9 @@ typedef PIFFT_float PIFFTf; #ifdef PIP_FFTW #include #include "fftw3.h" +#include "pimutex.h" + +static PIMutex __pip_fft_plan_mutex; template class PIP_EXPORT PIFFTW @@ -134,21 +137,27 @@ class PIP_EXPORT PIFFTW public: const PIVector > & calcFFT(const PIVector > &in) { result.resize(in.size()); + __pip_fft_plan_mutex.lock(); p = fftw_plan_dft_1d(in.size_s(), (fftw_complex *)in.data(), (fftw_complex *)result.data(), FFTW_FORWARD, FFTW_ESTIMATE); + __pip_fft_plan_mutex.unlock(); fftw_execute(p); fftw_destroy_plan(p); return result; } const PIVector > & calcFFT(const PIVector &in) { result.resize(in.size()); + __pip_fft_plan_mutex.lock(); p = fftw_plan_dft_r2c_1d(in.size_s(), (double *)in.data(), (fftw_complex *)result.data(), FFTW_ESTIMATE); + __pip_fft_plan_mutex.unlock(); fftw_execute(p); fftw_destroy_plan(p); return result; } const PIVector > & calcFFTinverse(const PIVector > &in) { result.resize(in.size()); + __pip_fft_plan_mutex.lock(); p = fftw_plan_dft_1d(in.size_s(), (fftw_complex *)in.data(), (fftw_complex *)result.data(), FFTW_BACKWARD, FFTW_ESTIMATE); + __pip_fft_plan_mutex.unlock(); fftw_execute(p); fftw_destroy_plan(p); return result; @@ -159,6 +168,7 @@ public: void preparePlan(int size, FFT_Operation op) { PIVector > in(size), out(size); PIVector inr(size); + __pip_fft_plan_mutex.lock(); switch (op) { case fo_real: p = fftw_plan_dft_r2c_1d(in.size_s(), (double *)inr.data(), (fftw_complex *)out.data(), FFTW_MEASURE); @@ -170,6 +180,7 @@ public: p = fftw_plan_dft_1d(in.size_s(), (fftw_complex *)in.data(), (fftw_complex *)out.data(), FFTW_BACKWARD, FFTW_MEASURE); break; } + __pip_fft_plan_mutex.unlock(); } private: