require 'fiddle' | |
class GVL | |
handle = Fiddle::Handle::DEFAULT | |
address = handle['rb_thread_blocking_region'] | |
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) } |
This comment has been minimized.
This comment has been minimized.
@luikore, |
This comment has been minimized.
This comment has been minimized.
Now, rb_thread_blocking_region is obsolete. |
This comment has been minimized.
This comment has been minimized.
it's replaced with |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This comment has been minimized.
Found this in
intern.h
:/* Use rb_thread_call_without_gvl family instead. */
btw, should that be
parallely
instead ofconcurrently
?