FREEMAIN
释放通过使用 GETMAIN 命令或对使用 RELOAD=YES 定义的程序,映射或表使用 LOAD 命令获取的主存储器。
语法
条件:
此命令是线程安全的。
NOHANDLE、RESP 和 RESP2是常用选项,可添加到所有 EXEC CICS 命令中以处理错误条件。 命令语法图和选项说明中没有明确包含这些选项。 有关这些常用选项和 EXEC CICS 命令语法的信息,请参阅 EXEC CICS 命令格式和编程注意事项.
描述
FREEMAIN 释放以下存储器:
- 由应用程序发出的 GETMAIN 命令获取的主存储器。 要释放使用 GETMAIN64 请求获取的主存储器,请使用 FREEMAIN64 命令。 请参阅 FREEMAIN64。
- LOAD 命令为使用 RELOAD=YES 定义的程序,映射或表获取的主存储器。
如果获取存储器或装入程序的任务未释放存储器,那么 CICS® 将在任务结束时释放存储器,但以下情况除外:
- GETMAIN 指定了 SHARED 选项。 在另一任务发出 FREEMAIN 或 FREEMAIN64 请求以释放存储器之前,该存储器将保持已分配状态。
- 该程序是使用 RELOAD=YES 定义的。 在另一任务发出 FREEMAIN 或 FREEMAIN64 请求以释放存储器之前,该存储器将保持已分配状态。
- 该程序是使用 RELOAD=NO 定义的,但是使用 HOLD 选项装入的。 该程序将保持可用状态,直到另一个任务将其释放为止。
注: 在列出的前两种情况中,使用 FREEMAIN 可能会创建对动态事务路由的使用产生负面影响的事务间亲缘关系。 有关事务亲缘关系的更多信息,请参阅 亲缘关系。
仅当在 CICS-key 中执行时,才能从程序释放 CICS-key 存储器。 如果先前获取的存储器是从 CICS-key 存储器获取的,并且发出 FREEMAIN 请求的程序是在用户密钥中,那么会出现 INVREQ 条件,并且 RESP2 值为 2。
选项
- 数据 (数据区)
- 指定要释放的主存储器的数据区。
在汇编程序中, data-area 必须是作为数据引用的可重定位表达式。 在 COBOL 或 C® 中,它必须是一个数据名称。 在 PL/I 中,它必须是一个数据引用。
释放的存储器长度是 GETMAIN 命令获取的长度,而不一定是数据区的长度。
- DATAPOINTER (ptr-value)
- 指定要释放的主存储器的地址作为指针引用。 此选项是 DATA 选项的替代选项,并指定 GETMAIN 命令使用 SET 选项返回的指针引用。
释放的存储器长度是 GETMAIN 命令获取的长度。
条件
- 16 INVREQ
- RESP2 值:
- 1
- DATA 或 DATAPOINTER 参数指定的存储器不是由 GETMAIN 命令获取的存储器。
- 2
- DATA 或 DATAPOINTER 参数指定的存储区在 CICS-key 存储器中,发出 FREEMAIN 命令的程序在用户键中。
- 3
- DATA 或 DATAPOINTER 参数指定的存储区由 CICS维护,尝试释放 CICS维护的存储区的任何 FREEMAIN 请求都会被拒绝。
缺省操作: 异常终止任务。
例如 COBOL
DATA DIVISION.
WORKING-STORAGE SECTION.
77 AREA-POINTER USAGE IS POINTER.
LINKAGE SECTION.
01 WORKAREA PIC X(100).
PROCEDURE DIVISION.
EXEC CICS GETMAIN SET(AREA-POINTER)
LENGTH(100)
END-EXEC.
.
SET ADDRESS OF WORKAREA TO AREA-POINTER.
.
.
EXEC CICS FREEMAIN DATA(WORKAREA)
END-EXEC.
EXEC CICS RETURN
END-EXEC.
另外,上一个 COBOL 示例可以使用以下命令释放存储空间:
EXEC CICS FREEMAIN DATAPOINTER(AREA-POINTER)
END-EXEC.
示例 :C
#pragma XOPTS(CICS);
#define MAINSIZE 100;
main()
{
char *buffer;
struct eib_record dfheiptr;
EXEC CICS ADDRESS EIB(dfheiptr);
EXEC CICS GETMAIN SET(buffer)
LENGTH(MAINSIZE);
buffer[2] = 'a';
.
.
EXEC CICS FREEMAIN DATA(buffer);
EXEC CICS RETURN;
}
例如 PL/I
DCL AREA_PTR POINTER,
WORKAREA CHAR(100) BASED(AREA_PTR);
.
.
.
EXEC CICS GETMAIN SET(AREA_PTR) LENGTH(100);
.
EXEC CICS FREEMAIN DATA(WORKAREA);
示例 :Assembler
WORKAREA DS CL100
.
.
EXEC CICS GETMAIN SET(9) LENGTH(100)
USING WORKAREA,9
EXEC CICS FREEMAIN DATA(WORKAREA)
或者,可以使用 DATAPOINTER 选项来释放存储器,如以下示例中所示:
WORKAREA DS CL100
.
EXEC CICS GETMAIN SET(9) LENGTH(100)
USING WORKAREA,9
.
.
DROP 9
.
EXEC CICS FREEMAIN DATAPOINTER(9)
