DEALLOCATE
DEALLOCATE 動詞は、2 つのトランザクション プログラム (TP) 間の会話の割り当てを解除します。
次の構造体では、 DEALLOCATE 動詞で使用される動詞制御ブロック (VCB) について説明します。
構文
struct deallocate {
unsigned short opcode;
unsigned char opext;
unsigned char reserv2;
unsigned short primary_rc;
unsigned long secondary_rc;
unsigned char tp_id[8];
unsigned long conv_id;
unsigned char reserv3;
unsigned char dealloc_type;
unsigned short log_dlen;
unsigned char FAR * log_dptr;
void (WINAPI *callback)();
void *correlator;
unsigned char reserv6[4];
};
メンバー
opcode
指定されたパラメーター。 動詞操作コード (AP_B_DEALLOCATE) を指定します。
opext
指定されたパラメーター。 動詞操作拡張機能AP_BASIC_CONVERSATIONを指定します。
reserv2
予約済みフィールド。
primary_rc
返されたパラメーター。 動詞の完了時に APPC によって設定されるプライマリ リターン コードを指定します。 有効なリターン コードは、発行された APPC 動詞によって異なります。 この動詞の有効なエラーコードについては、「リターン コード」を参照してください。
secondary_rc
返されたパラメーター。 動詞の完了時に APPC によって設定されるセカンダリ リターン コードを指定します。 有効なリターン コードは、発行された APPC 動詞によって異なります。 この動詞の有効なエラーコードについては、「リターン コード」を参照してください。
tp_id
指定されたパラメーター。 ローカル TP を識別します。 このパラメーターの値は、呼び出し元の TP の TP_STARTED または呼び出された TP のRECEIVE_ALLOCATE によって返されました。
conv_id
指定されたパラメーター。 2 つの TP 間で確立された会話を識別します。 このパラメーターの値は、呼び出し元 TP の ALLOCATE または呼び出された TP のRECEIVE_ALLOCATE によって返されます。
reserv3
予約済みフィールド。
dealloc_type
指定されたパラメーター。 割り当て解除の実行方法を指定します。
次のいずれかの値を使用すると、会話が異常に割り当て解除されます。
AP_ABEND_PROG
AP_ABEND_SVC
AP_ABEND_TIMER
ローカル TP が DEALLOCATE を発行したときにメッセージ交換が SEND 状態の場合、APPC は、会話の割り当てを解除する前に、ローカル論理ユニットの (LU) 送信バッファーの内容をパートナー TP に送信します。 メッセージ交換が RECEIVE またはPENDING_POST状態の場合、APPC はメッセージ交換の割り当てを解除する前に受信データを消去します。
アプリケーションまたはサービス TP は、トランザクションの正常な完了を妨げるエラーが発生したときにAP_ABEND_PROGを指定する必要があります。
サービス TP は、パートナー サービス TP によって発生したエラーが発生したときにAP_ABEND_SVCを指定する必要があります (たとえば、パートナー サービス TP によって送信された制御情報の形式エラー)。 サービス TP は、即時割り当て解除を必要とするエラーが発生したときにAP_ABEND_TIMERを指定する必要があります (たとえば、オペレーターがプログラムを途中で終了した場合など)。
AP_FLUSHは、会話の割り当てを解除する前に、ローカル LU の送信バッファーの内容をパートナー TP に送信します。 この値は、会話が SEND 状態の場合にのみ許可されます。
AP_SYNC_LEVELは、会話の同期レベル ( ALLOCATE によって確立) を使用して、会話の割り当てを解除する方法を決定します。 この値は、会話が SEND 状態の場合にのみ許可されます。
会話の同期レベルがAP_NONE場合、APPC は、会話の割り当てを解除する前に、ローカル LU の送信バッファーの内容をパートナー TP に送信します。
同期レベルがAP_CONFIRM_SYNC_LEVEL場合、APPC はローカル LU の送信バッファーの内容と確認要求をパートナー TP に送信します。 パートナー TP から確認を受け取ると、APPC は会話の割り当てを解除します。 ただし、パートナー TP がエラーを報告した場合、会話は引き続き割り当てられます。
log_dlen
指定されたパラメーター。 エラー ログ ファイルに送信するデータのバイト数を指定します。 範囲は 0 ~ 32767 です。dealloc_typeが AP_ABEND_PGM、AP_ABEND_SVC、または AP_ABEND_TIMER に設定されている場合は、このパラメーターを 0 より大きい数値に設定できます。 それ以外の場合、このパラメーターは 0 である必要があります。
log_dptr
指定されたパラメーター。 エラー情報を含むデータ バッファーのアドレスを提供します。 データは、ローカル エラー ログとパートナー LU に送信されます。log_dlenが 0 より大きい場合、このパラメーターは DEALLOCATE によって使用されます。
Microsoft Windows の場合、データ バッファーは静的データ領域またはグローバルに割り当てられた領域に配置できます。 データ バッファーは、この領域内に完全に収まる必要があります。
OS/2 の場合、ログ データ バッファーは、フラグが 1 に等しい関数 DosAllocSeg によって割り当てられる、名前のない共有セグメント上に存在する必要があります。 ログ データ バッファーは、セグメントに完全に収まる必要があります。
TP では、エラー データを GDS エラー ログ変数として書式設定する必要があります。 詳細については、IBM SNA マニュアルを参照してください。
コールバック (callback)
指定されたパラメーター。 AP_EXTD_VCB ビットが opext メンバーに設定されている場合にのみ存在し、同期ポイントのサポートを示します。 このパラメーターは、ユーザー指定のコールバック関数のアドレスです。 このフィールドが NULL の場合、通知は提供されません。コールバック ルーチンのプロトタイプは次のとおりです。
void WINAPI callback_proc(
struct appc_hdr *vcb,
unsigned char tp_id[8],
unsigned long conv_id,
unsigned short type,
void *correlator
);
コールバック プロシージャは、プロシージャのアドレスが APPC DLL に渡されるため、任意の名前を取ることができます。 関数に渡されるパラメーターは次のとおりです。
Vcb
会話の割り当てを解除する原因となった DEALLOCATE 動詞制御ブロックへのポインター。
tp_id
割り当て解除された会話を所有していた TP の TP 識別子。
conv_id
割り当て解除された会話の会話識別子。
型
コールバックが呼び出される原因となったメッセージ・フローのタイプ。 次のいずれかの値になります。
AP_DATA_FLOW
セッション上の通常のデータ フロー。
AP_UNBIND
セッションは正常にバインド解除されました。
AP_FAILURE
停止が原因でセッションが終了しました。
相関
この値は、DEALLOCATE 動詞で指定された相関子です。
相関
指定されたパラメーター。 AP_EXTD_VCB ビットが opext メンバーに設定されている場合にのみ存在し、同期ポイント API のサポートを示します。 この 相関 フィールドを使用すると、TP はコールバック関数への呼び出しを独自の内部データ構造に関連付けるために使用できる値を指定できます。 この値は、コールバック ルーチンが呼び出されたときに、コールバック ルーチンのパラメーターの 1 つとして TP に返されます。
reserv4
予約済みフィールド。
リターン コード
AP_OK
プライマリ リターン コード。動詞は正常に実行されました。
AP_PARAMETER_CHECK
プライマリ リターン コード。パラメーター エラーのため、動詞は実行されませんでした。
AP_BAD_CONV_ID
セカンダリ リターン コード。 conv_id の値が、APPC によって割り当てられた会話識別子と一致しませんでした。
AP_BAD_TP_ID
セカンダリ リターン コード。 tp_id の値が、APPC によって割り当てられた TP 識別子と一致しませんでした。
AP_DEALLOC_BAD_TYPE
セカンダリ リターン コード。 dealloc_type パラメーターが有効な値に設定されていません。
AP_DEALLOC_LOG_LL_WRONG
セカンダリ リターン コード。GDS エラー・ログ変数の LL フィールドが、ログ・データの実際の長さと一致しませんでした。
AP_INVALID_DATA_SEGMENT
セカンダリ リターン コード。ログ ファイルのエラー データが、エラー データを格納するために割り当てられたセグメントよりも長かったか、エラー データ バッファーのアドレスが間違っていました。
AP_STATE_CHECK
プライマリ リターン コード。動詞は無効な状態で発行されたため、実行されませんでした。
AP_DEALLOC_CONFIRM_BAD_STATE
セカンダリ リターン コード。メッセージ交換が SEND 状態ではなく、TP が送信バッファーをフラッシュして確認要求を送信しようとしました。 この試行は、 dealloc_type の値がAP_SYNC_LEVELされ、会話の同期レベルがAP_CONFIRM_SYNC_LEVELされたために発生しました。
AP_DEALLOC_FLUSH_BAD_STATE
セカンダリ リターン コード。メッセージ交換が SEND 状態ではなく、TP が送信バッファーをフラッシュしようとしました。 この試行は、dealloc_type の値が AP_FLUSH であったか、または dealloc_type の値が AP_SYNC_LEVEL で、メッセージ交換の同期レベルが AP_NONE であったために行われました。 どちらのケースでも、メッセージ交換は SEND 状態である必要があります。
AP_DEALLOC_NOT_LL_BDY
セカンダリ リターン コード。メッセージ交換が SEND 状態で、TP が論理レコードの送信を完了しませんでした。 dealloc_type パラメーターが AP_SYNC_LEVEL または AP_FLUSH に設定されていました。
AP_ALLOCATION_ERROR
プライマリ リターン コード。APPC で会話の割り当てに失敗しました。 会話の状態は RESET に設定されます。
このコードは、 ALLOCATE の後に発行された動詞を介して返すことができます。
AP_ALLOCATION_FAILURE_NO_RETRY
セカンダリ リターン コード。構成エラーやセッション プロトコル エラーなどの永続的な条件のため、会話を割り当てることができません。 エラーを特定するには、システム管理者がエラー ログ ファイルを調べる必要があります。 エラーが修正されるまで、割り当てを再試行しないでください。
AP_ALLOCATION_FAILURE_RETRY
セカンダリ リターン コード。リンクエラーなどの一時的な状態のため、会話を割り当てませんでした。 エラーの理由は、システム エラー ログに記録されます。 割り当てを再試行してください。
AP_CONVERSATION_TYPE_MISMATCH
セカンダリ リターン コード。パートナー LU または TP は、割り当て要求で指定された会話の種類 (基本またはマップ) をサポートしていません。
AP_PIP_NOT_ALLOWED
セカンダリ リターン コード。割り当て要求で PIP データが指定されましたが、パートナー TP がこのデータを必要としないか、パートナー LU でサポートされていません。
AP_PIP_NOT_SPECIFIED_CORRECTLY
セカンダリ リターン コード。パートナー TP には PIP データが必要ですが、割り当て要求で PIP データが指定されていないか、パラメーターの数が正しくありません。
AP_SECURITY_NOT_VALID
セカンダリ リターン コード。割り当て要求で指定されたユーザー ID またはパスワードが、パートナー LU によって受け入れられなかった。
AP_SYNC_LEVEL_NOT_SUPPORTED
セカンダリ リターン コード。パートナー TP は、割り当て要求で指定された sync_level (AP_NONEまたはAP_CONFIRM_SYNC_LEVEL) をサポートしていないか、 sync_level が認識されませんでした。
AP_TP_NAME_NOT_RECOGNIZED
セカンダリ リターン コード。パートナー LU は、割り当て要求で指定された TP 名を認識しません。
AP_TRANS_PGM_NOT_AVAIL_NO_RETRY
セカンダリ リターン コード。リモート LU は、要求されたパートナー TP を開始できなかったため、割り当て要求を拒否しました。 条件は永続的です。 エラーの理由が、リモート ノードでログに記録されている可能性があります。 エラーが修正されるまで、割り当てを再試行しないでください。
AP_TRANS_PGM_NOT_AVAIL_RETRY
セカンダリ リターン コード。リモート LU は、要求されたパートナー TP を開始できなかったため、割り当て要求を拒否しました。 状態は一時的 (タイム アウトなど) である可能性があります。エラーの理由が、リモート ノードでログに記録されている可能性があります。 割り当てを再試行してください。
AP_COMM_SUBSYSTEM_ABENDED
プライマリ リターン コード。次のいずれかの条件を示します。
このメッセージ交換で使用されているノードで、ABEND が発生しました。
TP と PU 2.1 ノードの間の接続が切断されました (LAN エラー)。
TP のコンピューターの SnaBase で ABEND が発生しました。
ABEND の理由を特定するには、システム管理者がエラー ログを調べる必要があります。
AP_COMM_SUBSYSTEM_NOT_LOADED
プライマリ リターン コード。動詞の処理中に、必要なコンポーネントを読み込めなかったか、終了できませんでした。 そのため、通信を行うことができませんでした。 是正措置については、システム管理者に問い合わせてください。AP_CONV_FAILURE_NO_RETRY
プライマリ リターン コード。セッション プロトコル エラーなどの永続的な条件が原因で、会話が終了しました。 システム管理者は、システム エラー ログを調べて、エラーの原因を特定する必要があります。 エラーが修正されるまで、会話を再試行しないでください。AP_CONV_FAILURE_RETRY
プライマリ リターン コード。一時的なエラーが発生したため、会話が終了しました。 TP を再起動して、問題が再度発生するかどうかを確認します。 その場合、システム管理者はエラー ログを調べて、エラーの原因を特定する必要があります。AP_CONVERSATION_TYPE_MIXED
プライマリ リターン コード。TP は、基本的な会話動詞とマップされた会話動詞の両方を発行しました。 1 つの会話で発行できる型は 1 つだけです。AP_INVALID_VERB_SEGMENT
プライマリ リターン コード。VCB がデータ セグメントの終わりを越えています。AP_PROG_ERROR_PURGING
プライマリ リターン コード。RECEIVE、PENDING、PENDING_POST、CONFIRM、CONFIRM_SEND、またはCONFIRM_DEALLOCATEの状態では、パートナー TP は err_type が AP_PROG に設定された SEND_ERROR を発行します。 送信されたデータがまだ受信されていないデータは消去されます。AP_STACK_TOO_SMALL
プライマリ リターン コード。アプリケーションのスタック サイズが小さすぎて動詞を実行できません。 アプリケーションのスタック サイズを増やしてください。AP_CONV_BUSY
プライマリ リターン コード。どの会話にも、一度に 1 つの未処理の会話動詞しか存在できません。 これは、ローカル TP に複数のスレッドがあり、複数のスレッドが同じ conv_idを使用して APPC 呼び出しを発行している場合に発生する可能性があります。AP_THREAD_BLOCKING
プライマリ リターン コード。呼び出し元のスレッドは、既にブロック呼び出しにあります。AP_UNEXPECTED_DOS_ERROR
プライマリ リターン コード。ローカル TP からの APPC 呼び出しの処理中に、オペレーティング システムから APPC にエラーが返されました。 オペレーティング システムのリターン コードは、secondary_rc 経由で返されます。 これは、Intel バイトスワップ順で表示されます。 問題が解決しない場合は、システム管理者に問い合わせてください。AP_DEALLOC_ABEND_PROG
プライマリ リターン コード。次のいずれかの理由で、会話の割り当てが解除されました。パートナー TP は、dealloc_typeが AP_ABEND_PROG に設定された DEALLOCATE を発行しました。
パートナー TP で異常終了が発生し、パートナー LU から DEALLOCATE 要求が送信されました。
AP_DEALLOC_ABEND_SVC
プライマリ リターン コード。パートナー TP が DEALLOCATE を発行し、 dealloc_typeが AP_ABEND_SVC に設定されているため、会話の割り当てが解除されました。AP_DEALLOC_ABEND_TIMER
プライマリ リターン コード。パートナー TP が DEALLOCATE を発行し、 dealloc_typeが AP_ABEND_TIMER に設定されているため、会話の割り当てが解除されました。AP_SVC_ERROR_PURGING
プライマリ リターン コード。RECEIVE、PENDING_POST、CONFIRM、 CONFIRM_SEND 、またはCONFIRM_DEALLOCATE状態の間に AP_SVC に設定されたerr_typeでSEND_ERROR発行されたパートナー TP (またはパートナー LU)。 パートナー TP に送信されたデータが削除された可能性があります。
注釈
dealloc_type パラメーターの値に応じて、TP が DEALLOCATE を発行した場合、会話は次の表に示すいずれかの状態になります。
dealloc_type | 許可された状態 |
---|---|
AP_FLUSH | SEND |
AP_SYNC_LEVEL | SEND |
AP_ABEND | RESET を除く任意 |
AP_ABEND_PROG | RESET を除く任意 |
AP_ABEND_SVC | RESET を除く任意 |
AP_ABEND_TIMER | RESET を除く任意 |
次の表に示す状態の変更は、 primary_rcの値に基づいています。
primary_rc | 新しい状態 |
---|---|
AP_OK | RESET |
AP_ALLOCATION_ERROR | RESET |
AP_CONV_FAILURE_RETRY | RESET |
AP_CONV_FAILURE_NO_RETRY | RESET |
AP_DEALLOC_ABEND | RESET |
AP_DEALLOC_ABEND_PROG | RESET |
AP_DEALLOC_ABEND_SVC | RESET |
AP_DEALLOC_ABEND_TIMER | RESET |
AP_PROG_ERROR_PURGING | RECEIVE |
AP_SVC_ERROR_PURGING | RECEIVE |
会話の割り当てを解除する前に、この動詞は次のいずれかに相当する処理を実行します。
FLUSH。ローカル LU の送信バッファーの内容をパートナー LU (および TP) に送信します。
ローカル LU の送信バッファーの内容と確認要求をパートナー TP に送信して確認します。
この動詞が正常に実行されると、会話識別子は無効になります。
LU 6.2 同期ポイントでは、暗黙的な忘れと呼ばれるメッセージ フローの最適化を使用できます。 プロトコルで FORGET PS ヘッダーが必要と指定されている場合、セッションの次のデータ フローは、FORGET が受信されたことを意味します。 通常の状況では、TP は、データが同期ポイントの会話のいずれかで受信または送信されるときに、次のデータ フローを認識します。
ただし、最後にフローするメッセージは、スレッドの割り当てが解除されたことが原因である可能性があります。 この場合、TP は、セッションで次のデータ フローが発生したときに認識されません。 この通知を TP に提供するために、 DEALLOCATE 動詞が変更され、TP が呼び出されるコールバック関数を登録できるようになります。
会話で使用されるセッションを介した最初の通常のフロー送信 (要求または応答)。
セッションが他のデータ フローの前にバインドされていない場合。
DLC 障害が原因でセッションが異常終了した場合。
DEALLOCATE 動詞には、コールバック関数の呼び出し時にパラメーターの 1 つとして返される相関フィールド メンバーも含まれています。 アプリケーションでは、このパラメーターを任意の方法で使用できます (たとえば、アプリケーション内の制御ブロックへのポインターとして)。
TP は、コールバック関数に渡される 型 パラメーターを使用して、暗黙的な忘れが受信されたことをメッセージ フローが示しているかどうかを判断できます。
コールバック ルーチンが呼び出される前に、 DEALLOCATE 動詞が完了する可能性があることに注意してください。 会話は RESET 状態であると見なされ、会話識別子を使用してそれ以上の動詞を発行することはできません。 アプリケーションがセッションの次のデータ フローの前に TP_ENDED 動詞を発行した場合、コールバック ルーチンは呼び出されません。
Host Integration Server では、SEND_DATAの type パラメーターを AP_SEND_DATA_DEALLOC_ * として指定 することで、データ送信直後に TP で会話の割り当てを解除できます。 ただし、SEND_DATA動詞には暗黙的な忘れコールバック関数は含まれていません。 暗黙的な忘れ通知を受け取る必要がある TP は、 DEALLOCATE を 明示的に発行する必要があります。