YamaKen
yamak****@bp*****
2005年 2月 8日 (火) 03:34:08 JST
ヤマケンです。口出しだけで申し訳ないです。 At Mon, 7 Feb 2005 19:29:17 +0900, ekato****@ees***** wrote: > On 2005/02/07, at 12:04, YamaKen wrote: > > まだ > > uim_helper_fd()まわりに問題があります。これの引き起こす問題につ > > いてちょっと説明不足だったのでuim_helper_send_message()にコメン > > トを追加しておきました。 > > 今ちょっと調べてみましたが、こっちはぼくには簡単ではなさそうです。 > 問題となっているのは uim-pref で「適用」ボタンを押すと、既存の IM コンテキストから > prop_list と prop_labelの update メッセージが helper になだれ込むことだと思 > います。 > > あまりよくわかってないのですが、helper-server が custom のメッセージを送るのと、 > prop のアップデートメッセージを受け取ることの両方で、fd が ready にならない状況が > 生まれ、ヤマケンさんご指摘の状態になることがあるようです。 > > ここでもし uim_helper_fd() なし、あるいは 返り値 >= 0 で write してしまうと、 > そのまま write で uim-pref ハングすることがかなりの確率で起きてしまいます。 > > custom 時に label のアップデートをさせないか、あるいは timeout の時間を設定して、 > なるべくそういった状況を回避することしかちょっと思いつきませんが、どうなんでしょう? まず、uim_helper_send_message()のようにwriteするだけの関数では uim_helper_fd()(つまりselect(2))無しで良いと思います。EPIPE等の エラーハンドリングを加えればコネクションが切れてる場合等にも対処 できるでしょう。 uim-helper-serverは多数のコネクションとの間でread(2)とwrite(2)を 繰り返すので適切にselect(2)する必要がありますね。これは既存の似 たようなコードを真似るのが安全だと思います。 ちょっと探してみたところでは rshd.c が近いようです。 http://www.jp.freebsd.org/cgi/cvsweb.cgi/~checkout~/src/libexec/rshd/rshd.c?rev=1.47&content-type=text/plain OpenBSDのものは3-clause BSD-style licenseになっているのでuimにも 流用可能ですね。ただしこちらではselect(2)の代わりにpoll(2)を使っ ています。 http://www.openbsd.org/cgi-bin/cvsweb/~checkout~/src/libexec/rshd/rshd.c?rev=1.51&content-type=text/plain ------------------------------- ヤマケン yamak****@bp*****