#include <stdio.h>
#include <cassert>
#include <stdexcept>
-#include <boost/thread.hpp>
+#include <gr_prefs.h>
-typedef boost::mutex::scoped_lock scoped_lock;
-static boost::mutex s_planning_mutex;
+boost::mutex &
+gri_fft_planner::mutex()
+{
+ static boost::mutex s_planning_mutex;
+
+ return s_planning_mutex;
+}
static char *
wisdom_filename ()
{
- static char *filename = ".gr_fftw_wisdom";
+ static const char *filename = ".gr_fftw_wisdom";
char *home = getenv ("HOME");
if (home){
gri_fft_complex::gri_fft_complex (int fft_size, bool forward)
{
// Hold global mutex during plan construction and destruction.
- scoped_lock lock(s_planning_mutex);
+ gri_fft_planner::scoped_lock lock(gri_fft_planner::mutex());
assert (sizeof (fftwf_complex) == sizeof (gr_complex));
reinterpret_cast<fftwf_complex *>(d_inbuf),
reinterpret_cast<fftwf_complex *>(d_outbuf),
forward ? FFTW_FORWARD : FFTW_BACKWARD,
- FFTW_MEASURE);
+ gr_prefs::singleton()->get_bool("fftw", "estimate", false) == true ? FFTW_ESTIMATE
+ : FFTW_MEASURE);
+
if (d_plan == NULL) {
fprintf(stderr, "gri_fft_complex: error creating plan\n");
gri_fft_complex::~gri_fft_complex ()
{
// Hold global mutex during plan construction and destruction.
- scoped_lock lock(s_planning_mutex);
+ gri_fft_planner::scoped_lock lock(gri_fft_planner::mutex());
fftwf_destroy_plan ((fftwf_plan) d_plan);
fftwf_free (d_inbuf);
gri_fft_real_fwd::gri_fft_real_fwd (int fft_size)
{
// Hold global mutex during plan construction and destruction.
- scoped_lock lock(s_planning_mutex);
+ gri_fft_planner::scoped_lock lock(gri_fft_planner::mutex());
assert (sizeof (fftwf_complex) == sizeof (gr_complex));
d_plan = fftwf_plan_dft_r2c_1d (fft_size,
d_inbuf,
reinterpret_cast<fftwf_complex *>(d_outbuf),
- FFTW_MEASURE);
+ gr_prefs::singleton()->get_bool("fftw", "estimate", false) == true ? FFTW_ESTIMATE
+ : FFTW_MEASURE);
if (d_plan == NULL) {
fprintf(stderr, "gri_fft_real_fwd: error creating plan\n");
gri_fft_real_fwd::~gri_fft_real_fwd ()
{
// Hold global mutex during plan construction and destruction.
- scoped_lock lock(s_planning_mutex);
+ gri_fft_planner::scoped_lock lock(gri_fft_planner::mutex());
fftwf_destroy_plan ((fftwf_plan) d_plan);
fftwf_free (d_inbuf);
gri_fft_real_rev::gri_fft_real_rev (int fft_size)
{
+ // Hold global mutex during plan construction and destruction.
+ gri_fft_planner::scoped_lock lock(gri_fft_planner::mutex());
+
assert (sizeof (fftwf_complex) == sizeof (gr_complex));
if (fft_size <= 0)