Global and Task-related Exit Programs

You must enable each user exit that an application program needs before it is called, and you can disable it when the application program has finished with it, though you do not have to; user exits are always disabled by default when CICS starts up. You use the CICS command ENABLE PROGRAM to enable a user exit program, and the CICS command DISABLE PROGRAM to disable a user exit program. If you try to enable an invalid exit an EIBRCODE of X'804000' is returned. If you try to enable an exit that is valid but not implemented, an EIBRCODE of X'804010' is returned. The EXTRACT EXIT command is also provided; you use this to gain access to the work area of a user exit program. For details of the level of support provided for these commands see the topic System Programmers Commands.

You must define each user exit program as a program (in the PLT) and the definition must be available on the running system.

For information about global user exits and task-related user exits see the IBM manual CICS/ESA 3.3 Customization Guide. This manual contains a list of valid user exit points.

You need to include the following two copybooks in your user exit program, whether it is for a global user exit or a task-related user exit:

Note:
  • The user exit parameters are passed to your exit program in structure uxi-user-exit-interface, defined in the copybook dfhcbuxi.cpy. Two fields in this structure, uxi-operational-flags-ptr and uxi-scheduling-flags-ptr, point respectively to two further structures, lk-uxc-operation and lk-uxz-schedule-param, in the other copybook, dfhcbuxc.cpy.
  • A CICS application can call a task-related user exit directly, for example, to obtain the address of the task area. Normally, the CICS application would call a task-related user exit program with the DFHRMCAL macro. As this macro is not supported, the application must call the user exit program directly, and must include the copy books dfhcbuxi.cpy and dfhcbuxc.cpy. If a user exit program can be called by an application program, you need to use a mechanism by which the exit program can decide whether it was called by an application program or by MSS. The sample exit program included below shows one approach: the application sets an unused bit in lk-uxc-schedule, which the user exit program tests for.

Here is a skeleton example of a task-related user exit program:

       id division.
       program-id. SAMPTRUE.
       environment division.
       configuration section.
       input-output section.
       data division.
       file section.
       working-storage section.
       linkage section .
       copy 'dfhcbuxi.cpy'.
       copy 'dfhcbuxc.cpy'.
       01 lk-global-area.
           03 lk-ga-byte pic x occurs 0 to 32767
               depending on uxi-global-area-length.
       01 lk-local-area.
           03 lk-la-byte pic x occurs 0 to 32767
               depending on uxi-local-area-length.

       procedure division using
                           uxi-user-exit-interface.
       module-entry-point.
           move 0                      to return-code
           set address of lk-uxc-operation
               to uxi-operational-flags-ptr
           set address of lk-uxc-schedule-parm
               to uxi-scheduling-flags-ptr
           move 0                      to lk-uxc-return-code
           *> -- Are we being called by an application?
           *> -- (User application sets unused value in lk-uxc-schedule.) 
           if lk-uxc-schedule = x'00'
               perform called-by-application
               goback
           end-if
           evaluate true
           when lk-uxc-initialization-88
               perform initialization
           when lk-uxc-shutdown-88
               goback
           when lk-uxc-task-start-88
               perform task-start-process
           when lk-uxc-task-syncpoint-88
               evaluate true
               when lk-uxc-syncpoint-prepare-88
                   perform syncpoint-prepare
               when lk-uxc-syncpoint-commit-88
                   perform syncpoint-commit
               when lk-uxc-syncpoint-rollback-88
                   perform syncpoint-rollback
               end-evaluate
           when lk-uxc-user-syncpoint-88
               set address of lk-global-area 
                   to uxi-global-area-ptr
               set address of lk-local-area 
                   to uxi-local-area-ptr
               evaluate true
               when lk-uxc-syncpoint-prepare-88
                   continue
               when lk-uxc-syncpoint-commit-88
                   perform syncpoint-commit
               when lk-uxc-syncpoint-rollback-88
                   perform syncpoint-rollback
               end-evaluate
           end-evaluate
           goback
           .
       called-by-application section.
           *> -- Add any code here that you wish to execute when
           *> -- called by an application program.
           exit
           .
       initialization section.
      $if 78-break-on-error defined
           call 'CBL_DEBUGBREAK'
      $end
           perform set-schedule-bits
           exit
           .
       task-start-process section.
           *> -- Insert code here that you wish to perform at
           *> -- start of task.
           perform set-schedule-bits
           exit
           .
       end-task-process section.
           *> -- Insert code here that you wish to perform at
           *> -- end of task.
           exit
           .
       syncpoint-prepare section.
           *> -- Insert code here that you wish to perform at
           *> -- syncpoint prepare.
           exit
           .
       syncpoint-commit section.
           *> -- Insert code here that you wish to perform at 
           *> -- syncpoint commit.
           exit
           .
       syncpoint-rollback section.
           *> -- Insert code here that you wish to perform at 
           *> -- syncpoint rollback.
           exit
           .
       set-schedule-bits section.
           initialize lk-uxc-schedule-byte
           *> -- Register start of task interest
           compute lk-uxc-schedule-byte-bin =
               lk-uxc-schedule-byte-bin B-OR 78-lk-uxc-TRUE-on-start
           *> -- Register syncpoint interest
           compute lk-uxc-schedule-byte-bin =
               lk-uxc-schedule-byte-bin B-OR 78-lk-uxc-TRUE-on-sync
           *> -- Register prepare interest
           compute lk-uxc-schedule-byte-bin =
               lk-uxc-schedule-byte-bin B-OR 78-lk-uxc-TRUE-on-prep
           exit
           .