2012-03-07 14 views
2

重要ではないネイティブ拡張では、インタープリタデータごとに動的に割り当てられる構造体が必要です。Tcl拡張:拡張のライフサイクルClientData

現在、Tcl_SetAssocDataを使用していますが、このメモリが漏れないように、拡張子の名前に と対応するキーと適切な削除ルーチン が対応しています。

しかし、Tcl_PkgProvideExでは、このような 情報も記録できます。この情報は Tcl_PkgRequireExによって取得できます。エクステンションのデータ構造体 をそのパッケージに関連付けることは、 "grab-bag"よりも自然なようです。 AssocData; Pkg * Exルーチンは、 自動的に呼び出された削除ルーチンを提供しません。だから、私は がAssocDataアプローチにとどまる必要があると思う。

Pkg * Exルーチンはどのような状況で使用されていましたか?

さらに、Tclライブラリでは、 ExitHandlersとThreadExitHandlersをインストールすることができます。 マニュアルを参照してください。バッファーをディスクなどにフラッシュします。

ExitHandlersを使用する必要がある他の状況はありますか?

Tclがexitを呼び出すと、Tcl_PackageUnloadProcsが呼び出されますか?

答えて

1

全体拡張ClientDataは、他の拡張が構築できる独自のスタブテーブル(正確なABIを表す関数の構成リスト)を公開する拡張機能を対象としています。これは非常にまれなことです。あなたが望んでいなければNULLにしておいてください。もしそうならTclコア開発者のメーリングリストに直接連絡してください;この分野でかなりの経験があります。 ABI構造のため、強くは静的なデータであると予想されるため、削除する必要はありません。動的データは、異なるメカニズム(例えば、Tclインタープリタを介して、またはABIを介した呼び出し関数を介して)を介して送信されるべきである。

終了ハンドラ(複数のレベルで登録可能)は、適切な時期に一部のリソースを削除する必要がある場合に使用するものです。典型的な関心事は、インタープリタ(Tcl_Interp構造)が削除されているとき、スレッドが削除されているとき、そしてプロセス全体がなくなるときである。どのようなリソースを特別に削除する必要がありますか?まあ、それは通常明らかです:ファイルハンドル、データベースハンドル、そのようなもの。細部が非常に重要なので一般的に答えるのは厄介です:より具体的な質問をして、適切なアドバイスを得る。

ただし、パッケージのアンロードコールバックは、unloadコマンドに対する応答としてのみ呼び出されます。パッケージのロードコールバックと同様に、それらは "特別な機能シンボル"の登録を使用し、存在しない場合、unloadコマンドはパッケージのアンロードを拒否します。 ほとんどのパッケージはそれらを使用しません。ユース・ケースは、余分なアップグレード可能な機能を追加する必要がある、非常に長寿命のプロセスが存在する場所です。

+0

「非常に長寿命」とは、何ヶ月から何年も連続して動作するプログラムを意味します。 Tclは、これが大きなセールスポイントであるエキゾチックな産業用制御システムのような場所で使用される傾向があります。 OTOH、それはまた、この種のものを実際に使用する唯一のコードが厳密に商業的(そして非常に専門的すぎる)であることを意味します... –