|
From: Kouhei S. <ko...@co...> - 2012-02-05 09:45:49
|
須藤です。 In <CAM...@ma...> "Re: [ruby-gnome2-devel-ja] ruby外のスレッドとの排他制御について" on Sun, 5 Feb 2012 08:34:37 +0900, Masaaki Aoyagi <mas...@gm...> wrote: >> で、Ruby/GStreamerはどうしているのかというと、Rubyのものじゃ >> ないスレッドからシグナルが飛んできたらRubyのスレッドでイベン >> トを処理して、元のシグナルを受け取ったスレッドにもどしてやる、 >> ということをしています。 >> rbgutil_start_callback_dispatch_thread()というのを呼ぶとこれ >> が動き出すようになります。 > > なるほど。rbgutil_start_callback_dispatch_threadでコールバック処理用のスレッドを動かした上で、 > G_PROTECT_CALLBACKでコールバック処理を依頼すると理解して、そのようにしたら一応 > 動くことが確認できました。 はい、それであっています。 ただ、ふつうのGLibからくるシグナルはRuby/GLib2内部で勝手に G_PROTECT_CALLBACKで呼び出すようになっているので、ふつうは G_PROTECT_CALLBACKを明示的に呼び出さなくてもよいはずです。 たとえば、GLib::Timeout.addとかは自分でブロックを実行するので G_PROTECT_CALLBACKを呼び出さないといけません。(でも、まだ呼 び出すようになっていません。。。) > ただ、自分の作っているアプリでは、デッドロックに入ったような状態になることがあるようで、 > まだ若干怪しいです。 うーん、この仕組みを使っているのがRuby/GStreamerだけでそんな に枯れているとはいえないのでまだ見落としているケースがあるか もです。。。 > それと、gstreamerでは確かにrbgutil_start_callback_dispatch_threadを使用しているのですが、 > G_PROTECT_CALLBACKを使っておらず、rbgutil_start_callback_dispatch_threadを無効に > しても動くようなので、この仕組みを使ってない気もするのですが、何か勘違いしてますでしょうか? あれ、そうですか。 sample/type-find.rbなんかは rbgutil_start_callback_dispatch_thread()なしで動かすと↓とい うのがでませんか? ** ERROR **: Please call rbgutil_start_callback_dispatch_thread() to dispatch a callback from non-ruby thread before callbacks are requested from non-ruby thread. >>> ちなみに、このバインディングはGTK向けであることと、メンテ(特にリファレンス)を手伝って欲しいなぁ >>> と思っているので、もしまともに動くようになったらRuby-GNOME2プロジェクトに入れて頂くことは >>> 可能でしょうか? >> >> あ、今の状態でいれちゃっていいですよ。 >> リポジトリに入っていたほうが参照しやすいですし。 > > ありがとうございます! > 早速入れちゃいました。 ありがとうございます! |