ノード:User defined module data, 次:, 前:Thread Saftey in libltdl, 上:Using libltdl



ロードされたモジュールに関連するデータ

libltdlが管理している,それぞれのロードされたモジュールに関する内部情 報には,ユーザが利用可能なものもあり,それは以下のような構造体の形式で す.

struct lt_dlinfo { char *filename; char *name; int ref_count; } Type
lt_dlinfoは,モジュールの情報を保存するために使用されます. filename属性は,NULLで終端された,実際のモジュールファイ ル名の文字列です.モジュールがlibtoolモジュールの場合,nameはそ のモジュール名(例えば,"dir/libfoo.la"に対する"libfoo") で,それ以外ではNULLに設定されます.ref_count属性は,現在 ロードされている同じモジュールの回数を記述する参照カウンタです.

以下の関数は,与えられたhandleに対するこの構造体のlibltdlの内部 のコピーへのポインタを返します.

const lt_dlinfo * lt_dlgetinfo (lt_dlhandle handle) 機能
モジュールhandleに関するいくつかの情報を含む構造体の,ポインタを 返します.構造体の内容は編集してはなりません.失敗時にはNULLが 返ります.

さらに,ロードした全てのモジュールのハンドルリストを保持する手助けをす るために,これらの関数で,ロードされているモジュールのlibltdlのリスト 全体を繰り返すことが可能となります.

int lt_dlforeach (int (*func) (lt_dlhandle handle, lt_ptr data), lt_ptr data) 機能
ロードされているそれぞれのモジュールに対し関数funcを呼び出します. 引数のhandleは,ロードされているモジュールのハンドルの一つで, dataは,lt_dlforeachに渡すdata引数です.func がハンドルの一つに対し,ゼロでない値を返すとすぐに, lt_dlforeachfuncの呼び出しを停止し,直ちに1を返します. それ以外は0が返ります.

lt_dlhandle lt_dlhandle_next (lt_dlhandle place) 機能
placeNULLの場合は,リスト内の最初のハンドルを返し,そし て順番に次ものを呼び出すことで,ロードされているモジュール全体を繰り返 します.placeが,ロードされているモジュールリスト内の最後の要素 の場合,この関数はNULLを返します.

もちろん,アプリケーションの目的のために,それぞれのハンドルに関連付け する必要があるデータがある場合,libltdlで管理されるリストと平行して, ロードされたモジュールハンドルの独自のリストの管理が必要になります.し かし,個別のモジュールハンドルを用いたアプリケーションデータに,ロード されたものとして関連付けさせるために,以下のAPIの呼び出しを使用す る場合には,実際にはそうする必要はありません.前もって保存したデータを 回収するために後で利用するlibltdlからのユニークな呼び出しidを,最初に 取得する必要があります.これで,ロードされているモジュールに対する独自 のデータを個別に保存したい異なるライブラリが,もう一つの(ライブラリ)の データへのインターフェースなしでそれを行うことが可能となります.

lt_dlcaller_id Type
個別のデータセットのキーを保つ,透過でない型です.

lt_dlcaller_id lt_dlcaller_register (void) 機能
モジュールデータごとに個別のセットを,保存し回収するためのユニークなキー を取得するために,これを使用してください.

lt_ptr lt_dlcaller_set_data (lt_dlcaller_id key, lt_dlhandle handle, lt_ptr data) 機能
後で回収するために,keyhandleにユニークに関連付けされた データのセットとして,dataを設定します.この関数は,以前に関連付 けされたkeyhandleがある場合は,その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);
                }
          

lt_ptr lt_dlcaller_get_data (lt_dlcaller_id key, lt_dlhandle handle) 機能
keyhandleに関連付けされている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);
     }