0C4 abends in DFHD2EX1 or unpredictable results when using PL/I
You are running CICS Transaction Server for z/OS and receive 0C4 abends in DFHD2EX1 with TRANISO active. If TRANISO is not active, unpredictable results occur. Note that the offset of the 0C4 varies depending on the PTF level of DFHD2EX1.
DFHAP0001 An abend (code 0C4/AKEA) has occurred at offset X'2610' in module DFHD2EX1.
PL/I subprogram that issues SQL calls does not have the REENTRANT option on the PROCEDURE statement.
Diagnosing the problem
Kernel error summary shows several tasks abending in DFHD2EX1. The failure occurs on a MVC instruction due to the contents of Reg7. Reg7 should address the SQL input parameter list or RDI (relational data system input parameter list). The 0C4s can also occur on a LH instruction in DFHD2EX1 due to the contents of Reg2. Reg2 should be addressing the RDI.
When TRANISO is active, the program checks are occurring because each task is trying to access storage for an RDI that is allocated to another task. The addresses of the RDIs are obtained from each task's LOT address +x'30'. There are several tasks whose LOT +x'30' all contain the same address, which causes them to use the same RDI. This problem is consistent with PL/I programs that do not specify the REENTRANT option in their PROCEDURE statement.
The DB2 pre-compiler builds the RDI in storage unique to the task. This is because the main PLI program does specify the PLI option REENTRANT. But the DB2 pre-compiler also builds an SQL parameter list that contains just one address, the address of the RDI. That parameter list is built within the subroutine itself.
When a task makes an SQL call, the DB2 pre-compiler code stores the address of the task's RDI in the PLI load module. If a second task comes along quickly to do an SQL call from a subprogram, the address of the second task's RDI is also stored in the same place in the load module. Now two requests from two different CICS tasks are in DB2 at the same time with the same SQL parameter list address. This can lead to various problems.
Resolving the problem
Ensure that your PL/I program is fully reentrant if it makes SQL calls within CICS.
For programs compiled with older PL/I compilers (such as IBM OS PL/I Optimizing Compiler VER 2 REL 3 MOD 0), this includes adding REENTRANT to the PROCEDURE statement.
CICS/TS CICS TS CICS Transaction Server