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