アプリケーションの記憶領域管理を単純化するために、ToolTalk サービスは、アプリケーションが ToolTalk サービスに提供するすべての情報をコピーし、アプリケーションに返す情報のコピーをユーザーに提供します。
ToolTalk サービスにポインタを与えるとき、そのポインタによって参照される情報がコピーされます。その結果、ユーザーが与えた情報を処理できます。ToolTalk サービスは、その情報を検索するためにそのポインタを再度使用しません。
ToolTalk サービスは、ToolTalk サービスがユーザーに提供する情報を格納するために、ToolTalk API ライブラリに割り当てスタックを提供しています。たとえば、tt_default_session を使ってデフォルトセッションの sessid を要求すると、ToolTalk サービスは sessid が入っている割り当てスタック (char * ポインタ) に文字列のアドレスを返します。sessid を検索後、その文字列を処理し、割り当てスタックを再配置できます。
API 割り当てスタックを、プログラムの実行時スタックと混同しないようにしてください。API スタックは、指示があるまで情報を破棄しません。
ToolTalk サービスでは、ToolTalk API 割り当てスタック内の情報の記憶領域を管理するために、表 13–1 に示した呼び出しを提供しています。
表 13–1 ToolTalk 記憶領域の管理
返される型 |
ToolTalk 関数 |
説明 |
---|---|---|
int |
tt_mark(void) |
一連の関数が返す情報にマークを付ける |
void |
tt_release(int mark) |
一連の関数が返す情報を解放する |
caddr_t |
tt_malloc(size_t s) |
ユーザー用に、割り当てスタック内に指定された量の記憶領域を確保する |
void |
tt_free(caddr_t p) |
tt_malloc が確保した記憶領域を解放する。この関数は、ToolTalk API が返したアドレスを使用し、関連付けられた記憶領域を解放する |
tt_mark() 関数と tt_release() 関数は、情報の記憶領域を管理しやすくするための一般的な機構です。tt_mark() 関数と tt_release() 関数は、通常、ルーチンが終了して ToolTalk サービスによって返された情報が必要なくなった場合に、ルーチンの開始と終了時に使用されます。
ToolTalk サービスに記憶領域の開始をマークするよう要求するには、tt_mark を使用します。ToolTalk サービスは、API スタック上の場所を表す整数のマークを 1 つ返します。ToolTalk サービスがそれ以降に返す情報はすべて、そのマークの後ろに格納されます。
記憶領域に格納されている情報が不要になった場合は、tt_release() を使用して、不要になった情報の開始位置を示すマークを指定します。
例 13–1 は、メッセージ内の情報を検査するルーチンの開始位置で tt_mark() を呼び出します。このルーチン内で検査された情報が不要になってメッセージが破棄されたとき、tt_release() がそのマークとともに呼び出され、スタック上の記憶領域を解放します。
tt_malloc() 関数と tt_free() 関数は、割り当てられた記憶領域割り当てを管理しやすくするための一般的な機構です。
tt_malloc() は、使用する割り当てスタック内に指定された量の記憶領域を確保します。たとえば、tt_malloc() を使用して、記憶領域の場所を作成し、デフォルトセッションの sessid をそこにコピーできます。
ToolTalk サービスがポインタを与える個々のオブジェクトの記憶領域を解放するには、tt_free() を使用します。たとえば、sessid を検査した後で sessid を格納する API 割り当てスタック内の容量を解放できます。tt_free() は、割り当てスタック内のアドレス (tt_malloc() から返された char * ポインタまたはアドレス) を引数としてとります。
フィルタ関数とコールバックに渡された情報によって ToolTalk サービスの動作を変える特殊な実装方法もあります。ToolTalk サービスが呼び出すコールバックルーチンとフィルタルーチンは、次に示す 2 種類の引数を伴って呼び出されます。
コンテキスト引数は、ToolTalk サービスからアプリケーションに渡されます。ポインタが参照する API オブジェクトは、コールバックまたはフィルタ関数が戻るとすぐに、ToolTalk サービスによって解放されます。これらのオブジェクトのどれかを保持したい場合は、関数が戻る前にそのオブジェクトをコピーしなければなりません。
フィルタ関数とコールバックに渡された情報に対する ToolTalk サービスの動作方法は特殊な場合です。他の場合はユーザーが解放するまでは、ToolTalk サービスが API 割り当てスタック内に情報を格納します。
ToolTalk サービスの機能の 1 つとして、メッセージ、パターン、およびフィルタのコールバックサポートがあります。コールバックは、特定のメッセージが届いたとき (「メッセージコールバック」)、またはメッセージが登録済みの特定のパターンに一致するとき (「パターンコールバック」) に ToolTalk が呼び出すプログラム内のルーチンです。
これらのコールバックについて ToolTalk サービスに知らせるには、メッセージを送信する前またはパターンを登録する前に、メッセージまたはパターンにコールバックを追加します。
tt_file_objects_query() などのファイル照会関数を呼び出す場合、照会から項目を返すときに、ToolTalk サービスが呼び出すフィルタルーチンを指します。たとえば、特定のオブジェクトを見つけるには、ToolTalk ファイル照会関数が使用するフィルタルーチンを使用できます。
tt_file_objects_query() 関数は、ファイルにすべてのオブジェクトを返し、ユーザーが与えるフィルタルーチンを介してそのオブジェクトを実行します。一度フィルタルーチンが指定されたオブジェクトを見つければ、tt_malloc() を使用して記憶場所を作成し、オブジェクトをそこにコピーできます。フィルタ関数が戻ると、ToolTalk サービスはファイル内でオブジェクトが使用する記憶領域をすべて解放しますが、tt_malloc() 呼び出しによって格納したオブジェクトは、それ以降も利用できます。