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];
};
Members
オペコード
指定されたパラメーター。 動詞の操作コード (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 動詞で指定された相関子です。
相関
指定されたパラメーター。 同期ポイント API のサポートを示す、 opext メンバーにAP_EXTD_VCB ビットが設定されている場合にのみ存在します。 この 相関子 フィールドを使用すると、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
プライマリ リターン コード。は、次のいずれかの条件を示します。
この会話で使用されたノードで、異常終了が発生しました。
TP と PU 2.1 ノード間の接続が切断されました (LAN エラー)。
TP のコンピューターの SnaBase で、異常終了が発生しました。
システム管理者は、エラー・ログを調べて、異常終了の理由を判別する必要があります。
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 | リセット |
| AP_ALLOCATION_ERROR | リセット |
| AP_CONV_FAILURE_RETRY | リセット |
| AP_CONV_FAILURE_NO_RETRY | リセット |
| AP_DEALLOC_ABEND | リセット |
| AP_DEALLOC_ABEND_PROG | リセット |
| AP_DEALLOC_ABEND_SVC | リセット |
| AP_DEALLOC_ABEND_TIMER | リセット |
| 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の 型 パラメーターを AP_SEND_DATA_DEALLOC_ * として指定 することで、データ送信直後に TP が会話の割り当てを解除できます。 ただし、SEND_DATA動詞には暗黙的な忘れコールバック関数は含まれません。 暗黙的な忘れ通知を受信する TP は、 DEALLOCATE を明示的に発行する必要があります。