Subject: Re: [ruby-ffi] Re: Crazy thought (wrapping rb_thread_blocking_region) |
From: Wayne Meissner |
Date: 1/7/10 7:10 PM |
To: ruby-ffi@googlegroups.com |
Support for this is technically there, however it is not expressable
using attach_function.
e.g.
lib = DynamicLibrary.open("libc.so", DynamicLibrary.RTLD_LAZY|
DynamicLibrary.RTLD_GLOBAL)
addr = lib.find_function("sleep")
# :blocking => true tells FFI the function will block, so it releases the GIL
fn = Function.new(:int, [ :int ], addr, { :blocking => true })
module Sleep
fn.attach(self, "libc_sleep")
end
Or something like that. There is a spec that tests the functionality,
which you might want to look at in case I got something wrong above.
I'm not sure I want to make this easier. On CRuby, it is really easy
to do nasty things if you're not careful with this, e.g. if a blocking
function calls a ruby callback, very bad things will happen. So you
really only want to use it for leaf functions.
The real solution of course, is to upgrade to JRuby - it handles all
this blocking stuff automagically.
2010/1/8 rogerdpack <rogerpack2005@gmail.com>:
several of these calls in parallel native threads) and I just found out about Ruby's "rb_thread_blocking_region" C call.It might be nice if FFI would optionally wrap its calls in an rb_thread_blocking_region (just on 1.9, I guess). -r