Sha256: 6ab800fe044c56494ce3e2b32f036b5a91c402f9c0335aa9d93d44dbfdee146e

Contents?: true

Size: 1.3 KB

Versions: 1

Compression:

Stored size: 1.3 KB

Contents

if !defined?(RUBY_ENGINE) && RUBY_VERSION =~ /^1.8/
  raise RuntimeError, "Sunscraper does not work on Ruby MRI 1.8.x."
end

require 'ffi'

# @private
module Sunscraper::Library
  extend FFI::Library

  # RbConfig sniffing does not work on JRuby.
  if Gem.win_platform?
    extension = 'dll'
  elsif RUBY_PLATFORM =~ /darwin/i
    extension = 'dylib'
  else
    extension = 'so'
  end

  ffi_lib File.join(Gem.loaded_specs['sunscraper'].full_gem_path,
                    'ext', "libsunscraper.#{extension}")

  attach_function 'create',    :sunscraper_create,    [],                  :pointer
  attach_function 'load_html', :sunscraper_load_html, [:pointer, :string], :void
  attach_function 'load_url',  :sunscraper_load_url,  [:pointer, :string], :void
  attach_function 'fetch',     :sunscraper_fetch,     [:pointer],          :string
  attach_function 'discard',   :sunscraper_discard,   [:pointer],          :void

  if RUBY_ENGINE == 'ruby'
    # MRI uses ffi gem and has GVL. Hence, it needs a rb_thread_blocking_region call.
    attach_function 'wait',    :sunscraper_wait,      [:pointer, :uint],   :void,    :blocking => true
  else
    # Rubinius does not have GVL neither it has options in attach_function.
    # Same for JRuby.
    attach_function 'wait',    :sunscraper_wait,      [:pointer, :uint],   :void
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
sunscraper-1.0.0 lib/sunscraper/library.rb