FREEMAIN

释放通过使用 GETMAIN 命令或对使用 RELOAD=YES 定义的程序,映射或表使用 LOAD 命令获取的主存储器。

语法

FREEMAIN

读取语法图跳过可视语法图FREEMAINDATA( data-area)DATAPOINTER( ptr-值)

条件:

此命令是线程安全的。

NOHANDLERESPRESP2是常用选项,可添加到所有 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 选项装入的。 该程序将保持可用状态,直到另一个任务将其释放为止。
如果程序正在 TRANSACTION 资源定义上使用 TASKDATAKEY (USER) 定义的任务下运行,请勿显式使用 FREEMAINFREEMAIN64 ,但允许在任务终止过程中释放存储器。
注: 在列出的前两种情况中,使用 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)