YamaKen
yamak****@bp*****
2005年 9月 26日 (月) 03:23:56 JST
ヤマケンです。加藤さん、こんばんは。 At Mon, 26 Sep 2005 00:14:47 +0900, ek.ka****@gmail***** wrote: > 05/09/18 に YamaKen<yamak****@bp*****> さんは書きました: > > また、しばらく前からuim_quit()でSEGVが発生する不具合が報告されて > > いますが、もしGCC4の最適化が原因だとしたらこの対策で解消するかも > > しれません。 > > 手元の gcc-4.0.1 の環境で問題が出てない状態だったので不思議に思い、 > dai さんと直接やりとりして uim_quit() 問題調べてみました。 > > で、結果として slib.c にあった単純なバグが原因だったようです。このバグは > --enable-debug した場合のみ出現するので、あまり顕在してこなかったの > かな、という感じです。とりあえずコンパイラ依存とかスレッドの問題では > ありませんでした。 いつも私の見落としを修正してくださってありがとうございます。非常 に助けられてます。 今回の障害は私の作業手順に問題があったため発生したものでした。再 発防止のため経緯を調べたので以下にまとめます。 まず、旧リポジトリのr1311で[Anthy-dev 1082]のパッチによりstruct objのdbg_infoメンバとそのハンドリングを含むNEWCELLが導入されまし た。 その後、新リポジトリのr777で[Anthy-dev 1793]のパッチによる機能追 加がなされましたが、同時に効率化のためdbg_infoへデバッグ情報の設 定はNEWCELL時ではなく実際に必要になった時点でlreadr()等により行 われるようになりました。 しかし、NEWCELL時のdbg_infoへの設定が丸ごとなくなってしまったた め、割り当て直後のcellのdbg_infoは未初期化のままになっていました。 この状態でGCが発生すると、gc_mark()中のgc_mark ((*ptr).dbg_info) というコードによって不正GCが発生します。 …というコードの動作を把握しきらずにcommitしてしまったため、バグ の発生に気付かなかったのが原因です。教訓としてはパッチをcommitす る時はきちんと内容を理解してからという事になります。 NEWCELL時にNILで初期化しておくのが本来の意図と思われるのでr1592 でそのように変更しておきました。しばらく問題が報告されなければ 0.4にもバックポートしておきます。 それからGCC4の最適化の問題は別件として存在するので、以下の手順で 作業を進める予定です。 1. uim-scm-gc.cをuim-scm.cにマージ (設計変更で不要になったため) 2. ドキュメント更新 3. COMPATIBILITY更新 4. 0.4ブランチにバックポート ------------------------------- ヤマケン yamak****@bp*****