Next: Module loaders for libltdl, Previous: Thread Saftey in libltdl, Up: Using libltdl
libltdlが管理している,それぞれのロードされたモジュールに関する内部情 報には,ユーザが利用可能なものもあり,それは以下のような構造体の形式で す.
lt_dlinfo
は,モジュールの情報を保存するために使用されます. filename属性は,NULL
で終端された,実際のモジュールファイ ル名の文字列です.モジュールがlibtoolモジュールの場合,nameはそ のモジュール名(例えば,"dir/libfoo.la"
に対する"libfoo"
) で,それ以外ではNULL
に設定されます.ref_count属性は,現在 ロードされている同じモジュールの回数を記述する参照カウンタです.
以下の関数は,与えられたhandleに対するこの構造体のlibltdlの内部 のコピーへのポインタを返します.
モジュールhandleに関するいくつかの情報を含む構造体の,ポインタを 返します.構造体の内容は編集してはなりません.失敗時には
NULL
が 返ります.
さらに,ロードした全てのモジュールのハンドルリストを保持する手助けをす るために,これらの関数で,ロードされているモジュールのlibltdlのリスト 全体を繰り返すことが可能となります.
ロードされているそれぞれのモジュールに対し関数funcを呼び出します. 引数のhandleは,ロードされているモジュールのハンドルの一つで, dataは,
lt_dlforeach
に渡すdata引数です.func がハンドルの一つに対し,ゼロでない値を返すとすぐに,lt_dlforeach
はfuncの呼び出しを停止し,直ちに1を返します. それ以外は0が返ります.
placeが
NULL
の場合は,リスト内の最初のハンドルを返し,そし て順番に次ものを呼び出すことで,ロードされているモジュール全体を繰り返 します.placeが,ロードされているモジュールリスト内の最後の要素 の場合,この関数はNULL
を返します.
もちろん,アプリケーションの目的のために,それぞれのハンドルに関連付け する必要があるデータがある場合,libltdlで管理されるリストと平行して, ロードされたモジュールハンドルの独自のリストの管理が必要になります.し かし,個別のモジュールハンドルを用いたアプリケーションデータに,ロード されたものとして関連付けさせるために,以下のapiの呼び出しを使用す る場合には,実際にはそうする必要はありません.前もって保存したデータを 回収するために後で利用するlibltdlからのユニークな呼び出しidを,最初に 取得する必要があります.これで,ロードされているモジュールに対する独自 のデータを個別に保存したい異なるライブラリが,もう一つの(ライブラリ)の データへのインターフェースなしでそれを行うことが可能となります.
モジュールデータごとに個別のセットを,保存し回収するためのユニークなキー を取得するために,これを使用してください.
後で回収するために,keyとhandleにユニークに関連付けされた データのセットとして,dataを設定します.この関数は,以前に関連付 けされたkeyとhandleがある場合は,そのdataを返します. 0の結果は,前回のエラー(が存在する場合)に対する診断結果が,
lt_dlerror()
で利用可能であることを示している可能性があります.例えば,いくつかの関連データを正しく削除するために,以下のようにします.
lt_ptr stale = lt_dlcaller_set_data (key, handle, 0); if (stale == NULL) { char *error_msg = lt_dlerror (); if (error_msg != NULL) { my_error_handler (error_msg); return STATUS_FAILED; } } else { free (stale); }
keyとhandleに関連付けされているdataのアドレス,また は,無い場合は
NULL
を返します.
ここまでの関数は,アプリケーションにロードされたりアンロードされたりし
たモジュールを追跡させる必要なく,オペレーションの検索と適用を実装する
ために,lt_dlforeach
と組み合わせることが可能です.
int my_dlcaller_callback (lt_dlhandle handle, lt_ptr key_ptr) { struct my_module_data *my_data; my_data = lt_dlcaller_get_data (handle, (lt_dlcaller_id) *key_ptr); return process (my_data); } int my_dlcaller_foreach (lt_dlcaller_id key) { lt_dlforeach (my_dlcaller_callback, (lt_ptr) &key); }