DEALLOCATE 動詞用來分配兩個交易程式(TPs)之間的對話。
以下結構描述了 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];
};
成員
操作碼
提供的參數。 指定動詞操作代碼,AP_B_DEALLOCATE。
Opext
提供的參數。 指定動詞運算延伸 AP_BASIC_CONVERSATION。
後備隊2
保留欄位。
primary_rc
回傳參數。 指定 APPC 在動詞結束時設定的主要回傳代碼。 有效的回傳代碼會依 APPC 所發出的動詞而有所不同。 請參閱返回代碼以了解此動詞的有效錯誤代碼。
secondary_rc
回傳參數。 指定 APPC 在動詞完成時設定的次要回傳碼。 有效的回傳代碼會依 APPC 所發出的動詞而有所不同。 請參閱返回代碼以了解此動詞的有效錯誤代碼。
tp_id
提供的參數。 辨識當地的衛生紙。 此參數的值由呼叫TP中的 TP_STARTED 回傳,或在呼叫TP中以 RECEIVE_ALLOCATE 回傳。
conv_id
提供的參數。 識別兩位TP之間建立的對話。 此參數的值由呼叫TP中的 ALLOCATE 或呼叫TP中的 RECEIVE_ALLOCATE 回傳。
後備隊3
保留欄位。
dealloc_type
提供的參數。 規定如何執行分配。
使用以下其中一個值會異常地分配對話:
AP_ABEND_PROG
AP_ABEND_SVC
AP_ABEND_TIMER
若當本地 TP 發出 DEALLOCATE 時,對話仍處於 SEND 狀態,APPC 會在解除分配對話前,將本地邏輯單元(LU)的 send buffer 內容傳送給合作夥伴 TP。 如果對話處於接收或PENDING_POST狀態,APPC 會在解除分配對話前清除所有進來資料。
應用程式或服務 TP 應在遇到阻礙交易成功完成的錯誤時指定AP_ABEND_PROG。
服務 TP 應在遇到由合作夥伴服務 TP 引起的錯誤(例如夥伴服務 TP 傳送的控制資訊格式錯誤)時,指定AP_ABEND_SVC。 服務TP在遇到需要立即解除配置的錯誤(例如操作員提前終止程式)時,應指定AP_ABEND_TIMER。
AP_FLUSH 會先將本地 LU 的 send buffer 內容傳送給合作夥伴 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,你可以將這個參數設為大於零的數值。 否則,這個參數必須為零。
log_dptr
提供的參數。 提供包含錯誤資訊的資料緩衝區位址。 資料會傳送到本地錯誤日誌及合作夥伴 LU。當 log_dlen 大於零時,DEALLOCATE 會使用此參數。
對於 Microsoft Windows,資料緩衝區可以位於靜態資料區或全域分配的區域。 資料緩衝區必須完全位於此區域內。
對於 OS/2,日誌資料緩衝區必須位於一個未命名的共享區段,該區段由函式 DosAllocSeg 分配,旗標數為 1。 日誌資料緩衝區必須完全安裝在該區段上。
TP 必須將錯誤資料格式化為 GDS 錯誤日誌變數。 欲了解更多資訊,請參閱您的 IBM SNA 手冊。
回傳
提供的參數。 只有當 AP_EXTD_VCB 位元設在 opextend 成員中,表示支援同步點時才會存在。 此參數為使用者提供的回撥函式位址。 若此欄位為 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 識別碼。
conv_id
已分配對話的對話識別碼。
型別
導致回撥被呼叫的訊息流類型。 可能的值為:
AP_DATA_FLOW
會話中正常的資料流。
AP_UNBIND
這場會議通常是無綁定的。
AP_FAILURE
該會議因故障而終止。
相關器
此值即為 DEALLOCATE 動詞所指定的相關詞。
相關器
提供的參數。 只有當 opext 成員中設定了 AP_EXTD_VCB 位元,表示支援同步點 API。 此 相關函數 欄位允許 TP 指定一個值,用以將呼叫回調函式與其自身內部資料結構相關聯。 當回調例程被呼叫時,這個值會作為參數之一回傳給 TP。
後備區4
保留欄位。
返回碼
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 嘗試清除 send 緩衝區並發送確認請求。 此嘗試發生是因為 dealloc_type 的價值AP_SYNC_LEVEL且對話的同步程度AP_CONFIRM_SYNC_LEVEL。
AP_DEALLOC_FLUSH_BAD_STATE
次要回傳代碼;對話時並非 SEND 狀態,TP 嘗試清除 send 緩衝區。 此嘗試發生是因為 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
次要回傳代碼;分配請求中指定的使用者識別碼或密碼未被合作夥伴 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 節點之間的連線已中斷(區域網路錯誤)。
TP 電腦的 SnaBase 遇到了 ABEND。
系統管理員應檢視錯誤日誌以判斷 ABEND 發生的原因。
AP_COMM_SUBSYSTEM_NOT_LOADED
主要退稅代碼;在處理動詞時,必須的元件無法被載入或終止。 因此,無法進行溝通。 請聯絡系統管理員以採取糾正措施。AP_CONV_FAILURE_NO_RETRY
主要退稅代碼;該對話因永久性狀況而終止,例如會話協定錯誤。 系統管理員應檢視系統錯誤日誌以找出錯誤原因。 在錯誤修正前,請勿重試對話。AP_CONV_FAILURE_RETRY
主要退稅代碼;由於臨時錯誤,對話被終止。 重新啟動 TP,看看問題是否會再次發生。 若有,系統管理員應檢查錯誤日誌以找出錯誤原因。AP_CONVERSATION_TYPE_MIXED
主要退稅代碼;TP 已發布基本與映射對話動詞。 一次對話只能發出一種類型。AP_INVALID_VERB_SEGMENT
主要退稅代碼;VCB 的範圍超出資料區段的末端。AP_PROG_ERROR_PURGING
主要退稅代碼;在 RECEIVE、PENDING、PENDING_POST、CONFIRM、CONFIRM_SEND 或 CONFIRM_DEALLOCATE 狀態下,合作夥伴 TP 發出SEND_ERROR,err_type設為 AP_PROG。 已送出但尚未收到的資料會被清除。AP_STACK_TOO_SMALL
主要退稅代碼;應用程式的堆疊大小太小,無法執行該動詞。 增加你的應用程式堆疊大小。AP_CONV_BUSY
主要退稅代碼;在任何對話中,一次只能有一個未完成的對話動詞。 如果本地 TP 有多條執行緒,且多個執行緒使用相同 conv_id發出 APPC 呼叫,這種情況就可能發生。AP_THREAD_BLOCKING
主要退稅代碼;呼叫的執行緒已經在阻塞通話中。AP_UNEXPECTED_DOS_ERROR
主要退稅代碼;作業系統在處理來自本地 TP 的 APPC 呼叫時,曾回傳錯誤給 APPC。 作業系統的回傳碼會透過 secondary_rc回傳。 它以英特爾位元組互換順序出現。 如果問題持續,請諮詢系統管理員。AP_DEALLOC_ABEND_PROG
主要退稅代碼;這次對話被分配的原因之一是:合作夥伴TP發行了DEALLOCATE,dealloc_type設定為AP_ABEND_PROG。
合作夥伴 TP 遇到 ABEND,導致合作夥伴 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
主要退稅代碼;合作夥伴 TP(或合作夥伴 LU)在 RECEIVE、PENDING_POST、CONFIRM、CONFIRM_SEND 或 CONFIRM_DEALLOCATE 狀態下,err_type 設定為 AP_SVC 發出SEND_ERROR。 傳送給合作夥伴 TP 的資料可能已被清除。
備註
根據 dealloc_type 參數的值,當 TP 發出 DEALLOCATE 時,對話可能處於下表所示的狀態之一。
| dealloc_type | 允許的州 |
|---|---|
| AP_FLUSH | SEND |
| AP_SYNC_LEVEL | SEND |
| AP_ABEND | 除了重置之外 |
| AP_ABEND_PROG | 除了重置之外 |
| AP_ABEND_SVC | 除了重置之外 |
| AP_ABEND_TIMER | 除了重置之外 |
狀態變化(如下表總結)是根據 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)。
CONFIRM,透過將本地 LU 的傳送緩衝區內容及確認請求傳送給合作夥伴 TP。
當該動詞成功執行後,對話識別碼就不再有效。
LU 6.2 同步點可使用稱為隱含遺忘(implied forget)的訊息流程優化。 當協定指定需要 FORGET PS 標頭時,該會話的下一個資料流表示已接收 FORGET 。 在正常情況下,TP 在其 Sync Point 對話中接收或傳送資料時,會知道下一個資料流。
然而,最後流出的訊息也可能是因為對話被重新分配所致。 在這種情況下,TP 不知道該會話中下一個資料流何時發生。 為了提供 TP 此通知, DEALLOCATE 動詞被修改,使 TP 能註冊回調函式,該函式將被呼叫:
在對話所使用的會話中進行的第一次正常流程傳輸(請求或回應)。
如果該會話在其他資料流之前是解綁的。
如果會話因 DLC 故障而異常終止。
DEALLOCATE動詞也包含一個相關欄位成員,當呼叫回調函式時,會作為參數回傳。 應用程式可以以任何方式使用此參數(例如,作為指向應用程式內控制區塊的指標)。
TP 可利用傳給回調函式的 型別 參數判斷訊息流是否表示已接收隱含遺忘。
請注意, DEALLOCATE 動詞通常會在回調例程被呼叫前完成。 對話被視為處於重置狀態,且無法再使用對話識別碼發出動詞。 如果應用程式在該會話的下一個資料流前發出 TP_ENDED 動詞,回調例程將不會被呼叫。
主機整合伺服器允許傳送者在傳送資料後立即解除分配對話,方法是在SEND_DATA上指定類型參數為AP_SEND_DATA_DEALLOC_*。 然而,SEND_DATA動詞並不包含隱含的忘記回調功能。 想要收到隱含遺忘通知的TP必須明確發出 DEALLOCATE 。