diff options
author | Andrej Rode <mail@andrejro.de> | 2017-04-30 00:01:58 -0700 |
---|---|---|
committer | Andrej Rode <mail@andrejro.de> | 2017-04-30 00:02:24 -0700 |
commit | 7864ce317d65f29abddbb3694b26315087654b1d (patch) | |
tree | 9ea9772999b308f6486b541c648761dd2e21975f /gr-fft | |
parent | 10b7f835854f46ac390fdb6954d312a6b0ba30e9 (diff) |
gr-fft: add locking mechanism to fftw_wisdom
Diffstat (limited to 'gr-fft')
-rw-r--r-- | gr-fft/lib/fft.cc | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/gr-fft/lib/fft.cc b/gr-fft/lib/fft.cc index 5af77d97eb..ef81583187 100644 --- a/gr-fft/lib/fft.cc +++ b/gr-fft/lib/fft.cc @@ -46,10 +46,12 @@ static int my_fftw_read_char(void *f) { return fgetc((FILE *) f); } #include <boost/filesystem/operations.hpp> #include <boost/filesystem/path.hpp> +#include <boost/interprocess/sync/file_lock.hpp> namespace fs = boost::filesystem; namespace gr { namespace fft { + static boost::mutex wisdom_thread_mutex; gr_complex * malloc_complex(int size) @@ -92,6 +94,30 @@ namespace gr { } static void + lock_wisdom() + { + const std::string wisdom_lock_file = wisdom_filename() + ".lock"; + int fd = open(wisdom_lock_file.c_str(), + O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, + 0666); + if (fd < 0){ + throw std::exception(); + } + boost::interprocess::file_lock wisdom_lock(wisdom_lock_file.c_str()); + wisdom_lock.lock(); + wisdom_thread_mutex.lock(); + } + + static void + unlock_wisdom() + { + const std::string wisdom_lock_file = wisdom_filename() + ".lock"; + boost::interprocess::file_lock wisdom_lock(wisdom_lock_file.c_str()); + wisdom_lock.unlock(); + wisdom_thread_mutex.unlock(); + } + + static void import_wisdom() { const std::string filename = wisdom_filename (); @@ -162,6 +188,7 @@ namespace gr { d_nthreads = nthreads; config_threading(nthreads); + lock_wisdom(); import_wisdom(); // load prior wisdom from disk d_plan = fftwf_plan_dft_1d (fft_size, @@ -175,6 +202,7 @@ namespace gr { throw std::runtime_error ("fftwf_plan_dft_1d failed"); } export_wisdom(); // store new wisdom to disk + unlock_wisdom(); } fft_complex::~fft_complex() @@ -233,6 +261,7 @@ namespace gr { d_nthreads = nthreads; config_threading(nthreads); + lock_wisdom(); import_wisdom(); // load prior wisdom from disk d_plan = fftwf_plan_dft_r2c_1d (fft_size, @@ -245,6 +274,7 @@ namespace gr { throw std::runtime_error ("fftwf_plan_dft_r2c_1d failed"); } export_wisdom(); // store new wisdom to disk + unlock_wisdom(); } fft_real_fwd::~fft_real_fwd() @@ -303,6 +333,7 @@ namespace gr { d_nthreads = nthreads; config_threading(nthreads); + lock_wisdom(); import_wisdom(); // load prior wisdom from disk // FIXME If there's ever a chance that the planning functions @@ -318,6 +349,7 @@ namespace gr { throw std::runtime_error ("fftwf_plan_dft_c2r_1d failed"); } export_wisdom (); // store new wisdom to disk + unlock_wisdom(); } fft_real_rev::~fft_real_rev () |