2007-07-07 [長年日記]
λ. Ruby-GNOME2のコールバック周りを少し整理
Rubyと関係ないネイティブスレッドからコールバックが呼ばれた場合にはRubyのスレッドに転送してから実行すべきなのだが、その部分がGRClosureにべったりだったので、分離してRuby-GNOME2の他のコールバックの処理でも使えるようにしてみた。
また、これまでのコードではコールバックの転送を待っているスレッドで受け取ったコールバックをそのまま実行すると、その内部で更にコールバックが発生したときにデッドロックしてしまうという問題があった。 これを回避するために、受け取ったコールバックの実行は新たに生成したスレッドで行うようにした。 ただ、これ効率悪いな。スレッドの生成が相対的に重い1.9では特に重いはず。 スレッドプールを作ってスレッドを使いまわすべきか。
また、1.9ではis_ruby_native_thread()が機能しなくなった(参考 [ruby-dev:31166])ので、コールバックの側で現在のスレッドがRubyのネイティブスレッドなのか判別できず、たとえ現在のスレッドがRubyのスレッドだとしても転送しなくてはならなくなっている。これは切ない。なんとかならないのかなぁ。
- 現在のスレッドがRubyのネイティブスレッドで、かつGVL(Giant VM Lock)を保持しているのなら、そのまま呼び出したい。
- 現在のスレッドがRubyのネイティブスレッドで、もしGVLを手放しているのなら、GVLを再び確保した上で、そのまま呼び出したい。
……と書いたが、[ruby-dev:31162]で落ちるので、1.9ではまだ試せていないのだった。
λ. Mutexとかめんどい
Ruby-GNOME2のコールバック周りをいじったときに、久しぶりにMutexやConditionVariableを使ったコードを書いたのだけど、面倒くさいな。 せめてMVarくらいあれば良いのにと思ってしまう。