Module: FFTW3::FFI::LibraryLoader
- Defined in:
- lib/fftw3/ffi/library_loader.rb
Constant Summary collapse
- LIBRARY_NAMES =
{ double: %w[libfftw3.so libfftw3.dylib fftw3.dll fftw3], float: %w[libfftw3f.so libfftw3f.dylib fftw3f.dll fftw3f], long_double: %w[libfftw3l.so libfftw3l.dylib fftw3l.dll fftw3l], quad: %w[libfftw3q.so libfftw3q.dylib fftw3q.dll fftw3q], threads_double: %w[libfftw3_threads.so libfftw3_threads.dylib fftw3_threads], threads_float: %w[libfftw3f_threads.so libfftw3f_threads.dylib fftw3f_threads], threads_long_double: %w[libfftw3l_threads.so libfftw3l_threads.dylib fftw3l_threads], threads_quad: %w[libfftw3q_threads.so libfftw3q_threads.dylib fftw3q_threads] }.freeze
Class Method Summary collapse
Class Method Details
.find(precision) ⇒ Object
17 18 19 20 21 22 23 24 25 26 27 28 29 |
# File 'lib/fftw3/ffi/library_loader.rb', line 17 def self.find(precision) names = LIBRARY_NAMES.fetch(precision) lib_dir = ENV["FFTW3_LIB_DIR"] if lib_dir names.each do |name| path = File.join(lib_dir, name) return path if File.exist?(path) end end names end |
.find_threads(precision) ⇒ Object
31 32 33 34 |
# File 'lib/fftw3/ffi/library_loader.rb', line 31 def self.find_threads(precision) key = :"threads_#{precision}" find(key) end |
.open(precision) ⇒ Object
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/fftw3/ffi/library_loader.rb', line 36 def self.open(precision) @dynamic_libraries ||= {} return @dynamic_libraries[precision] if @dynamic_libraries.key?(precision) loaded_path = begin fftw_module = FFTW3::FFI.module_for(precision) fftw_module.ffi_libraries.first&.name if fftw_module.respond_to?(:ffi_libraries) rescue FFTW3::Error::InvalidArgument nil end library_names = [loaded_path, *Array(find(precision))].compact.uniq library = library_names.filter_map do |name| begin ::FFI::DynamicLibrary.open(name, ::FFI::DynamicLibrary::RTLD_LAZY) rescue LoadError, RuntimeError nil end end.first return @dynamic_libraries[precision] = library if library raise FFTW3::Error::LibraryNotFound, "Unable to load FFTW library for #{precision}" end |