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 遇到阻止事务成功完成的错误时,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 报告错误,则仍会分配会话。

回调
提供的参数。 仅当在 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

会话因服务中断而终止。

correlator

此值是在MC_DEALLOCATE谓词上指定的关联符

correlator
提供的参数。 仅当在 opext 成员中设置AP_EXTD_VCB位表示对同步点 API 的支持时才存在。 此 关联器 字段允许 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 发送
AP_SYNC_LEVEL 发送
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 收到

在解除分配会话之前,此谓词将执行以下等效项之一:

  • 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 谓词不包含隐含的忘记回调函数。 希望接收隐式忘记通知的 TP 必须显式发出 MC_DEALLOCATE