MC_DEALLOCATE
MC_DEALLOCATE谓词解除分配两个事务程序 (TP) 之间的会话。
以下结构描述了MC_DEALLOCATE谓词使用的谓词控制块 (VCB ) 。
语法
struct mc_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 char reserv4[2];
unsigned char reserv5[4];
void (WINAPI *callback)();
void *correlator;
unsigned char reserv6[4];
};
成员
opcode
提供的参数。 指定谓词操作代码,AP_M_DEALLOCATE。
opext
提供的参数。 指定谓词操作扩展,AP_MAPPED_CONVERSATION。
reserv2
一个保留字段。
primary_rc
返回的参数。 指定在谓词完成时由 APPC 设置的主要返回代码。 有效的返回代码因发出的 APPC 谓词而异。 有关此谓词的有效错误代码,请参阅“返回代码”。
secondary_rc
返回的参数。 指定在谓词完成时由 APPC 设置的次要返回代码。 有效的返回代码因发出的 APPC 谓词而异。 有关此谓词的有效错误代码,请参阅“返回代码”。
tp_id
提供的参数。 标识本地 TP。 此参数的值由调用 TP 中的 TP_STARTED 或调用的 TP 中的 RECEIVE_ALLOCATE 返回。
conv_id
提供的参数。 标识在两个TP 之间建立的会话。 此参数的值由调用 TP 中的 MC_ALLOCATE 或调用的 TP 中的 RECEIVE_ALLOCATE 返回。
reserv3
一个保留字段。
dealloc_type
提供的参数。 指定如何执行解除分配。
对于 MC_DEALLOCATE,请使用 AP_ABEND 异常地解除分配会话。 如果当本地 TP 发出 MC_DEALLOCATE时会话处于 SEND 状态,APPC 会在解除分配会话之前将本地逻辑单元 (LU) 发送缓冲区的内容发送到合作伙伴 TP。 如果会话处于 RECEIVE 或PENDING_POST状态,APPC 会在解除分配会话之前清除任何传入数据。
TP 在遇到阻止事务成功完成的错误时,应指定AP_ABEND。
AP_FLUSH在解除分配会话之前,将本地 LU 的发送缓冲区的内容发送到合作伙伴 TP。 仅当会话处于 SEND 状态时,才允许使用此值。
AP_SYNC_LEVEL使用MC_ALLOCATE) 建立 (会话 的同步级别来确定如何解除分配会话。 仅当会话处于 SEND 状态时,才允许使用此值。
如果会话的同步级别AP_NONE,APPC 会在解除分配会话之前将本地 LU 的发送缓冲区的内容发送到合作伙伴 TP。
如果同步级别AP_CONFIRM_SYNC_LEVEL,APPC 会将本地 LU 的发送缓冲区的内容和确认请求发送到合作伙伴 TP。 收到合作伙伴 TP 的确认后,APPC 将解除分配对话。 但是,如果合作伙伴 TP 报告错误,则聊天仍被分配。
回调 (callback)
提供的参数。 仅当 opext 成员中设置了指示支持同步点的 AP_EXTD_VCB 位时,才存在。 此参数是用户提供的回调函数的地址。 如果此字段为 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
指向导致解除分配会话 的MC_DEALLOCATE 谓词控制块的指针。
tp_id
拥有已解除分配的会话的 TP 的 TP 标识符。
conv_id
已解除分配的会话的会话标识符。
类型
导致调用回调的消息流的类型。 可能的值为:
AP_DATA_FLOW
会话上的正常数据流。
AP_UNBIND
会话正常未绑定。
AP_FAILURE
会话因中断而终止。
相关
此值是在MC_DEALLOCATE谓词上指定的相关器。
相关
提供的参数。 仅当 opext 成员中设置了指示对同步点 API 的支持AP_EXTD_VCB位时,才存在。 此 关联器 字段允许 TP 指定一个值,该值可用于将回调函数的调用与其自己的内部数据结构相关联。 调用时,此值作为回调例程的参数之一返回到 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_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_ALLOCATION_ERROR
主返回代码;APPC 未能分配会话。 会话状态设置为 RESET。
此代码可以通过 MC_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 节点之间的连接已断开(LAN 错误)。
TP 计算机上的 SnaBase 遇到了 ABEND。
系统管理员应检查错误日志以确定发生 ABEND 的原因。
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 颁发 MC_SEND_ERROR。 已发送但尚未接收的数据将被清除。AP_STACK_TOO_SMALL
主要返回代码;应用程序的堆栈大小太小,无法执行谓词。 增加应用程序的堆栈大小。AP_CONV_BUSY
主返回代码;在任何对话中,一次只能有一个未完成的对话谓词。 如果本地 TP 具有多个线程,并且多个线程使用相同的 conv_id发出 APPC 调用,则可能会发生这种情况。AP_THREAD_BLOCKING
主要返回代码;调用线程已在某个阻塞调用中。AP_UNEXPECTED_DOS_ERROR
主要返回代码;操作系统在处理来自本地 TP 的 APPC 调用时向 APPC 返回了错误。 已通过 secondary_rc 返回了操作系统返回代码。 此返回代码是以 Intel 字节交换顺序显示的。 如果问题持续出现,请咨询系统管理员。AP_DEALLOC_ABEND
主返回代码;由于以下原因之一,已解除分配会话:合作伙伴 TP 颁发的MC_DEALLOCATE,dealloc_type设置为 AP_ABEND。
合作伙伴 TP 遇到 ABEND,导致合作伙伴 LU 发送 MC_DEALLOCATE 请求。
注解
根据 dealloc_type 参数的值,当 TP 发出MC_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 |
在解除分配会话之前,此谓词将执行以下操作之一的等效操作:
MC_FLUSH,将本地 LU 的发送缓冲区的内容发送到合作伙伴 LU (和 TP) 。
MC_CONFIRM,方法是将本地 LU 的发送缓冲区的内容和确认请求发送到合作伙伴 TP。
成功执行此谓词后,会话标识符将不再有效。
LU 6.2 同步点可以使用称为隐式忘记的消息流的优化。 当协议指定需要 FORGET PS 标头时,会话上的下一个数据流表示已收到 FORGET。 在正常情况下,当在其某个同步点对话上接收或发送数据时,TP 会知道下一个数据流。
但是,要流出的最后一条消息可能是由正在解除分配的会话引起的。 在这种情况下,TP 不知道何时发生会话上的下一个数据流。 为了向 TP 提供此通知,修改 了MC_DEALLOCATE 谓词,以允许 TP 注册将调用的回调函数:
在第一次正常流传输 (会话) 请求或响应。
如果会话在任何其他数据流之前未绑定。
如果会话由于 DLC 中断而异常终止。
MC_DEALLOCATE谓词还包含一个关联器字段成员,该成员在调用回调函数时作为参数之一返回。 例如,应用程序可以以任何方式使用此参数 (作为指向应用程序) 中的控制块的指针。
TP 可以使用传递给回调函数 的类型 参数来确定消息流是否指示已收到隐式忘记。
请注意, MC_DEALLOCATE 谓词可能会在调用回调例程之前完成。 会话被视为处于 RESET 状态,不能使用会话标识符发出进一步的谓词。 如果应用程序在会话的下一个数据流之前发出 TP_ENDED 谓词,则不会调用回调例程。
主机集成服务器允许 TP 在发送数据后立即解除分配会话,方法是将 MC_SEND_DATA 上的类型参数指定为 AP_SEND_DATA_DEALLOC_*。 但是, MC_SEND_DATA 谓词不包含隐含的 forget 回调函数。 希望接收隐式忘记通知的TP 必须明确发出 MC_DEALLOCATE 。