module Concurrent::Utility::NativeExtensionLoader

def allow_c_extensions?

def allow_c_extensions?
  Concurrent.on_cruby?
end

def c_extensions_loaded?

def c_extensions_loaded?
  defined?(@c_extensions_loaded) && @c_extensions_loaded
end

def java_extensions_loaded?

def java_extensions_loaded?
  defined?(@java_extensions_loaded) && @java_extensions_loaded
end

def load_error_path(error)

def load_error_path(error)
  if error.respond_to? :path
    error.path
  else
    error.message.split(' -- ').last
  end
end

def load_native_extensions

def load_native_extensions
  if Concurrent.on_cruby? && !c_extensions_loaded?
    ['concurrent/concurrent_ruby_ext',
     "concurrent/#{RUBY_VERSION[0..2]}/concurrent_ruby_ext"
    ].each { |p| try_load_c_extension p }
  end
  if Concurrent.on_jruby? && !java_extensions_loaded?
    begin
      require 'concurrent/concurrent_ruby.jar'
      set_java_extensions_loaded
    rescue LoadError => e
      raise e, "Java extensions are required for JRuby.\n" + e.message, e.backtrace
    end
  end
end

def set_c_extensions_loaded

def set_c_extensions_loaded
  @c_extensions_loaded = true
end

def set_java_extensions_loaded

def set_java_extensions_loaded
  @java_extensions_loaded = true
end

def try_load_c_extension(path)

def try_load_c_extension(path)
  require path
  set_c_extensions_loaded
rescue LoadError => e
  if load_error_path(e) == path
    # move on with pure-Ruby implementations
    # TODO (pitr-ch 12-Jul-2018): warning on verbose?
  else
    raise e
  end
end