Skip to content

Instantly share code, notes, and snippets.

@havenwood
Forked from tenderlove/gvl_release.rb
Last active August 24, 2019 12:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save havenwood/8b351d1e0b53c195bf0055cc23c208e7 to your computer and use it in GitHub Desktop.
Save havenwood/8b351d1e0b53c195bf0055cc23c208e7 to your computer and use it in GitHub Desktop.
require 'fiddle'
class GVL
handle = Fiddle::Handle::DEFAULT
address = handle['rb_thread_call_without_gvl']
func = Fiddle::Function.new address, [Fiddle::TYPE_VOIDP,
Fiddle::TYPE_VOIDP,
Fiddle::TYPE_VOIDP,
Fiddle::TYPE_VOIDP], Fiddle::TYPE_VOIDP
define_method(:unlocked) do |&block|
closure = Class.new(Fiddle::Closure) {
define_method(:call) { |ptr|
Fiddle.dlwrap block.call
}
}.new(Fiddle::TYPE_VOIDP, [Fiddle::TYPE_VOIDP])
func.call(closure, nil, nil, nil).to_value
end
end
def fib n
if n < 3
1
else
fib(n-1) + fib(n-2)
end
end
gvl = GVL.new
p gvl.unlocked { fib(34) }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment