W.Deeの2005年2月の日記

kikyou.info»日記
最新月 : 2008年10月
2003年 [             3    4    5    6    7    8    9   10   11   12  ] 月
2004年 [   1    2    3    4    5    6    7    8    9   10   11   12  ] 月
2005年 [   1    2    3    4    5    6    7    8    9   10   11   12  ] 月
2006年 [   1    2    3    4    5    6    7    8    9   10   11   12  ] 月
2007年 [   1    2    3    4    5    6    7    8    9   10   11   12  ] 月
2008年 [   1    2    3    4    5    6    7    8    9   10   11   12  ] 月
2009年 [   1    2    3    4    5    6    7    8    9   10   11       ] 月
前月の日記  次月の日記

2005年2月14日

吉里吉里のSubversionリポジトリ

そういえば書いてなかったですが、吉里吉里の Subversion リポジトリは https://sv.kikyou.info/svn/kirikiri2/ です。読み取りは自由ですが、書き込みにはアカウントが必要です。アカウントについては W.Dee までお問い合わせください。

Doxygen

井元氏にやりかたを教わって 吉里吉里のクロスリファレンスを Doxygen を使って生成してみました。http://devdoc.kikyou.info/tvp/doxygen/current/html/ にあります。

毎朝 8 時に trunk からソースをとってきて自動的に更新するようになっています。ドキュメント生成には kikyou.info サーバ (Pentium 4 2.66GHz×1, Memory 1GB, Linux 2.4) で 20 分ほどかかるようです。

吉里吉里2は、はっと「Doxygen とか使っておいたほうがいいんじゃないだろうか」と気づいた時には もうすでに手遅れ状態で、コメント書く気がせず、いまでもそれについては放置です。そりゃもちろん、時間があればやりたいんですが。

あと設計が汚いからか、生成されるコラボレーション図とかが凶悪です。とくに tTJSNI_BaseLayer とか。…にしてもわけわからんですな。

nView Desktop Manager

nVIDIA 製グラフィックカードのドライバに付属してくる nView Desktop Manager を使用しているときに吉里吉里がフリーズする (場合によっては OS を巻き込んでフリーズする) という不具合があるのですが、先日 GeFore 6600 GT のカードを買ってきたので自分の環境でもテストしてみました。

…普通にフリーズしますね。KAGでスキップ中に吉里吉里がハングアップします。そのうち、フォーカスを切り替えたウィンドウが次々とフリーズするようになります。結局リセットボタンを押すか、(cygwinのsshdを走らせているので) 外部から SSH でログインして shutdown -r -f やるかじゃないと再起動できなくなります。

デバッガ上で動作させ、ハングアップ中にプロセスを中止させると nView.dll 内で無限ループにはまっている模様。nView.dll はアプリケーションのウィンドウプロシージャをフックしている DLL のようです。呼び出し履歴を見ると AllocateHWnd 関数内から呼び出された位置でハングアップしてます。

AllocateHWnd は VCL の提供する関数で、非表示のウィンドウを一個作ります。基本的にはメッセージキューをそこで動作させるだけですので、そのままメッセージキューとして使ったり、他のスレッドからメインスレッドにメッセージを投げたいときとかに使います。呼び出し履歴の元の方には吉里吉里の Timer クラスのコンストラクタがありました。Timer クラスは、タイミングを管理しているサブスレッドからメッセージを受け取るために AllocateHWnd でメッセージキューを作成します。

スキップ中には Timer クラスのオブジェクトが頻繁に生成と消滅を繰り返す場合があって、そのような場合にハングアップが起きているようでした。

試しに、以下のようなコードが 50ms おきに繰り返し実行されるような簡単なプログラムを作って動作させると、見事にハングアップします。もちろん、nView Desktop Manager を無効にしておくとハングアップしません。

HWND UtilWindow;

UtilWindow = AllocateHWnd(NULL);
DeallocateHWnd(UtilWindow);
UtilWindow = AllocateHWnd(NULL);
DeallocateHWnd(UtilWindow);
UtilWindow = AllocateHWnd(NULL);
DeallocateHWnd(UtilWindow);
/* (略) AllocateHWnd と DeallocateHWnd を 10 回ぐらい繰り返す */

一応 nVIDIA には、実際にクラッシュさせるための最小限のコードを示し、不具合報告しておきました。

吉里吉里の方は、Timer の実装を少し変えて、AllocateHWnd が Timer と一緒に生成・消滅されないようにしました。結果的に Timer の処理はほんの少し軽くなったと思います。また、少なくとも、うちの環境では nView Desktop Manager を有効にしていても吉里吉里がハングアップすることは無くなりました。trunk にはコミットしてありますが、2.24-stable にマージするかどうかは、もうちょっと様子を見てからにしたいと思います。

もっとも、うちの環境では nView Desktop Manager を起動させていると他のアプリ(コマンドプロンプトを大量に一度に立ち上げたときとか)がハングアップするので、結局 nView Desktop Manager は無効にせざるを得ません。

Google で検索してみても分かりますが、nView Desktop Manager は不具合を結構引き起こすソフトのようです。本家で改善していただけるとありがたいですけど、本家で改善されたっていったって、それを見てドライバをすぐに更新する人はそうは居ないだろうし、そもそも nView Desktop Manager が原因だって気づいている人もそう多くはないでしょうから、困った物です。

  • 2005-02-23 14:59 W.Dee : その後 nVIDIA からは音沙汰ないですなぁ。 たぶん送ったメール見てもないと思います (テストプログラムはkikyou.infoサーバにおいてあるのでダウンロードしようとすればアクセスログに残るはずだし)。 送り先か書き方が悪かったのだろうか。 ま、修正なんて半分は期待してないですけど。

2005年2月4日

2.24 RC2 と 2.25 beta 1

もうそろそろ 2.24 RC2 と 2.25 beta 1 を公開しようと思います。

2.24 RC2 は、バグ修正と、ひとつ新規機能を追加してあります。

新規機能というか機能強化ですが、KAGParser がシナリオファイルをキャッシュするようになりました。いままでだと、たとえば return タグで元のシナリオに戻るとき、もとのシナリオファイルを読み込みなおしていました。シナリオの読み込み動作は文字コードの変換(MBCS->Unicode)、行分割、ラベルキャッシュの再構築などいろいろあって、結構重たい処理なので、シナリオファイルとそれに関連する情報をメモリ上に8個まで保持するようにしました。

RC になってから機能を追加するのはあまりよくないことだと思うのですが、call 〜 return を多用する例が増えているようなので急遽対応しました。

2.25 beta 1 はいろいろ変わっています。プラグインのバイナリインターフェースが変わったので従来のプラグインは再コンパイルしないと繋がりません。プラグイン側でネイティブ実装したクラスを提供し、吉里吉里側で使用するのが簡単にできるようになりました。あとはポップアップメニューなどの実装に便利そうな Window 関連のプロパティを追加しました。

インフルエンザにかかった

インフルエンザにかかりました。結構しつこいです。たとえ安静にしていても、完全に回復するまでは3日間〜7日間ぐらいはかかるかも知れません。

みなさんもお気を付けて。

  • 2005-02-04 13:59 ゆん : あららら。インフルエンザは大変ですね。お大事に。
  • 2005-02-05 11:17 ささら : 完治するまで、ゆっくり休養してください。ご自愛のほどを。
  • 2005-02-12 11:33 W.Dee : どうもですー やっと完治かなといったところです。きわめてしつこかったです。
  • 2005-02-13 11:29 薫 : 完治されてよかったです。でも、お身体気をつけてください。