Establishing addressability for function calls
Because QMF always branches to an entry point named DSQUnGV1 (TSO, ISPF, or native z/OS®) or DSQUnGV3 (CICS®) when it calls the governor, you cannot use these entry points to determine the type of function call; instead, use the GOVFUNCT field of the DXEGOVA control block.
In the IBM-supplied governor exit routine, GOVFUNCT contains a character value that identifies the type of function call. This character value, in turn, equates to a 1-byte binary integer from 1 to 10. For example, on a function call for the start of a QMF session, the value of GOVFUNCT is GOVINIT, which equates to a numeric value of X'1'.
Both character and numeric values for each type of function call are shown in this figure. GOVABEND is not called when running in CICS.
GOVINIT EQU 1 -------- INITIALIZATION OF SESSION
GOVTERM EQU 2 -------- TERMINATION OF SESSION
GOVSCMD EQU 3 -------- START COMMAND
GOVECMD EQU 4 -------- END COMMAND
GOVCONN EQU 5 -------- CONNECT COMMAND
GOVSDBAS EQU 6 -------- START DATABASE
GOVEDBAS EQU 7 -------- END DATABASE
GOVSACTV EQU 8 -------- SUSPEND QMF ACTIVITY
GOVRACTV EQU 9 -------- RESUME QMF ACTIVITY
GOVABEND EQU 10 -------- QMF ABEND OPERATION
To improve performance in your own exit routine, you can follow the convention the IBM-supplied governor uses, and equate the values of GOVFUNCT with binary numbers by using a branch table. QMF uses the branch table to find the addresses to branch to for each type of function call.
The following example code identifies branch addresses for the default governor.
XR R07,R07 ZERO REGISTER 7
IC R07,GOVFUNCT IDENTIFY EXIT TYPE
SLL R07,2 DETERMINE BRANCH TABLE OFFSET
LA R15,FUNBTAB(R07) GET BRANCH TABLE ADDRESS
L R15,0(R15) GET BRANCHING ADDRESS
BALR R14,R15 BRANCH TO THE APPROPRIATE CODE
. . .
. . .
. . .
. . .
FUNBTAB DS 0F
DC A(BYPASS) VALUE "0" - UNUSED
DC A(INIT) VALUE "1" - QMF INITIALIZATION
. . .
. . .
. . .
DC A(SUSPEND) VALUE "10" - QMF ABEND IN PROCESS