ToolTalk ユーザーズガイド

第 13 章 情報記憶領域の管理

アプリケーションの記憶領域管理を単純化するために、ToolTalk サービスは、アプリケーションが ToolTalk サービスに提供するすべての情報をコピーし、アプリケーションに返す情報のコピーをユーザーに提供します。

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() がそのマークとともに呼び出され、スタック上の記憶領域を解放します。


例 13-1 記憶領域の情報のマーク付け

 	/*
	 * Get a storage mark so we can easily free all the data
  * ToolTalk returns to us.
	 */

	mark = tt_mark();

	if (0==strcmp("ttsample1_value", tt_message_op(msg_in))) {
			tt_message_arg_ival(msg_in, 0, &val_in);
			xv_set(gauge, PANEL_VALUE, val_in, NULL);
 }

	tt_message_destroy(msg_in);
 tt_release(mark);
	return;


記憶領域の割り当てと解放

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() 呼び出しによって格納したオブジェクトは、それ以降も利用できます。