(toppers-users 509) RE: TOPPERS/JSP のコンフィグレータ

Takayuki WAKABAYASHI takayuki @ ertl.ics.tut.ac.jp
2002年 9月 5日 (木) 14:03:31 JST


To: 松川さん

豊橋技術科学大学の若林です。

コンフィギュレータに関するご意見をお寄せいただき、ありがとうございます。

Tatsuhiko Matsukawa [mailto:KFC00725 @ nifty.ne.jp] さんは書きました:
 > (1) コンフィグレータの出力である、kernel_cfg.c/kernel_id.hの出力を
 >     mpstrstreamのデストラクタ中で行っているようですが、これがmain()の
 >     try/catchブロックの外になってしまうため、このファイル書き出しでエ
 >     ラー(出力先がリードオンリとか)となった場合、本来のエラーメッセー
ジ
 >     (「ファイルが作れません」)が出ません。

これは私も先日ハマりました。
別件で作っているコンフィギュレータのテストを行っている際、元と先を間違っ
てReadOnlyがついたkernel_cfg.cをコピーしてきてしまい、見事にAbnormal
Program Terminationが出ました。

対処法ですが、mpstrstreamは自動破棄対象のクラスであるので、manage.cpp:78
にあるGarbage::finalCleanup();関数を、69行目の
Component::executeComponents(top);の下に持ってくることで、同処理が
try-catchブロック内に入ります。


 > (2) 単に使い勝手の問題ですが・・・(これも上記(1)同様、デストラクタで
フ
 >     ァイル出力を行っていることに起因すると思われます。)
 >     コンフィグレーションファイルの解析中にエラーとなったような場合で
も
 >     ファイルkernel_cfg.c/kernel_id.hが作成されてしまいます。make等か
ら
 >     コンフィグレータを呼び出しているような場合、エラーでも新しいタイ
ム
 >     スタンプのこれらのファイルが作成されてしまうと、(ソースを修正せず
 >     に)再度makeを実行した場合に、コンフィグレータが実行されなくなって
 >     しまいます。

おっしゃるとおりです。本来ならエラーで終了するような場合には、ノータッチ
で終了するか、関連する出力ファイルを全削除というのが正しいと思います。こ
の機能は次期コンフィギュレータに盛り込みたいと思います。ほかの皆様もこの
件に関してご意見があれば、こちらにお寄せ頂ければ幸いです。
 #オプションで切り分けられたほうがいいとか、
 #デフォルトはこっちがいいとか、こっちだけでいいとか など

ちなみに現在のmake対策は、例外で終了したときにはEXIT_FAILUREを返すのみで
す。たしかにこれでは松川さんのおっしゃるとおり、現在のmakeのフェーズは正
常に処理できますが、次のフェーズの更新ファイルのチェックを狂わせます。


 > (3) ご承知の上でやっていらっしゃるならいいのですが・・・・
 >     jsp_perser.cppがperser.cppよりも先にリンクされるとプログラムが正
常
 >     に動作しません。

現在のコンフィギュレータは、コンパイル順序が狂うとまずい記述が多くありま
す。たとえば、
 - componentクラス と jspの処理系
 - StaticAPIクラス と jspの静的APIクラス
 - jspのCoreParserクラス と ConfigurationFileGeneratorクラス
などは、宣言順が狂うと実行時エラーとなります。

これは、コンフィギュレータの本体を書き直さなくても、Instanciateした時点
で勝手にコンポーネントが追加されたら楽でいいなぁと思って作ったものです。
この機能は結果としてコンパイル順序に依存するという頭の痛い問題を抱え込み
ました。
基底クラスには、Instanciateしたクラスのポインタのリストがあるのですが、
これの初期化よりも先に派生クラスのInstanciateが行われると、未初期化のリ
ストに対して操作を行い、実行時エラーとなります。
個人的には、何かうまい方法でこの問題を回避できないものかと画策中です (現
在のコンフィギュレータは無用な汎用性を抱えています)。
 #Visual C++はABC順にコンパイルするので名前付けに工夫がしてあります。
 #これでも避けられないものが、jsp_instanciate.cppに入っています。


コンフィギュレータは「ツール」ですので、使いやすさを向上させるようなご意
見は大歓迎です。松川さん、ご意見ありがとうございました。

--------
  わかばやし たかゆき (mailto:takayuki @ ertl.ics.tut.ac.jp)