2011-03-14 5 views
0

私はFFIを使用してSOファイルをラップしています。私はFFIコールをタイムアウトする必要がありますが、残念ながらタイムアウトは、Timeout, System timeout & terminator not working for FFI based functionで言及したような一般的な方法では起こりませんでした。通話にタイムアウトを与えるオプションがありますか?FFIはルビースレッドをブロックし、タイムアウトブロックにFFI呼び出しを配置できませんでした

事前にお寄せいただきありがとうございます。

答えて

-1

JRubyのようなGIL(グローバルインタプリタロック)を持たないRubyランタイムを使用することをお勧めします。ブロックされたFFI呼び出しを正しく処理する必要があります。

他のルビーランタイムでは、ネイティブ呼び出しを中断できるようにするには、関数を「ブロッキング」関数としてマークする必要があります.FFIはこの関数の呼び出しをGILでアンロックし、中断するように設定します。

require 'ffi' 
module Sleep 
    extend FFI::Library 

    ffi_lib FFI::Library::LIBC 

    # Tell FFI that this function may block 
    @blocking = true 
    attach_function :sleep, [:uint], :void 
end 

@blockingはスティッキーではありません。ブロックするとマークするすべての 'attach_function'コールの前に設定する必要があります。

これは100%確実な解決策ではありません。ネイティブコードでブロックされている関数を中断することは、割り込み可能な関数(例えばスリープ、リード、ライトなど)では一般的に機能しますが、一部のネイティブコードでは機能しません。

私はこれをテストしていませんが、FFIリポジトリにlibrary.rbのコードによって判断し、これは上記のよりよい選択肢でなければなりません
+0

このようなFFI内のインスタンス変数。代わりに、[attach_function](http://rdoc.info/gems/ffi/FFI/Library:attach_function)に ':blocking'オプションを使用してください。 – SFEley

2

:**プライベートに設定しないでください

require 'ffi' 
module Sleep 
    extend FFI::Library 

    ffi_lib FFI::Library::LIBC 

    attach_function :sleep, [:uint], :void, :blocking => true 
end 
+0

なぜdownvote? –

関連する問題