The follow code supports a FIFO control block chain in CSA. When nothing is in the queue the first and last pointers are zero. It must not be working properly because one of my users gets orphan control blocks periodically. I’ve looked at this until my eyes hurt. Does anyone see the problem in this code? Thank you in advance for taking the time to look at this problem for me.
CSAMSEGF DS AD Pointer to FIRST CB
CSAMSEGL DS AD Pointer to last CB in chain
MSEGNEXT DS AD NEXT Control block in chain
Code to add a CB to the chain:
*C DO UNTIL MSEGCB IS CONNECTED TO THE CHAIN (PLO SERIALIZED)
DOX378 DS 0H
* R8 = ADDRESS OF NEW MSEG BEING ADDED
*C SET R6 = CSAMSEGL
LG R6,CSAMSEGL
*C SET CONTECTION INDEX UP BY 1
LA R2,1(R2)
*C IF CSAMSEGF AND CSAMSEGL EQ 0
*C SET CSAMSEGF AND CSAMSEGL = NEW MSEGCB ADDRESS
STG R8,OPERAND1R (REPLACES CSAMSEGL)
XC OPERAND1,OPERAND1 (COMPARISON VALUE)
XC OPERAND3,OPERAND3 (COMPARISON VALUE)
STG R8,OPERAND3R (REPLACES WHERE OPERAND4 POINTS)
LA R0,DCSG
LGR R3,R8
LA R4,CSAMSEGF
STG R4,OPERAND4
PLO 0,CSAMSEGL,0,PL
*
* IF DOUBLE COMPARE AND SWAP IS SPECIFIED, THE FIRSTOPERAND
* COMPARISON VALUE AND THE SECOND
* OPERAND ARE COMPARED. IF THEY ARE EQUAL, THE
* THIRD-OPERAND COMPARISON VALUE AND THE FOURTH
* OPERAND ARE COMPARED. IF BOTH COMPARISONS INDICATE
* EQUALITY, THE FIRST-OPERAND AND THIRD-OPERAND
* REPLACEMENT VALUES ARE STORED AT THE SECONDOPERAND
* LOCATION AND FOURTH-OPERAND LOCATION,
* RESPECTIVELY. IF THE FIRST COMPARISON INDICATES INEQUALITY,
* THE SECOND OPERAND IS PLACED IN THE FIRSTOPERAND-
* COMPARISON-VALUE LOCATION AS A NEW FIRSTOPERAND
* COMPARISON VALUE. IF THE FIRST COMPARISON
* INDICATES EQUALITY BUT THE SECOND DOES NOT, THE
* FOURTH OPERAND IS PLACED IN THE THIRD-OPERANDCOMPARISON-
* VALUE LOCATION AS A NEW THIRD-OPERAND
* COMPARISON VALUE.
*
BC 7,ELIFX378 (BRANCH IF NOT SUCCESSFULL)
*C ELSE
some logging code not included
B EIFX378
ELIFX378 DS 0H
*C IF CSAMSEGL = R6 (ORIGINAL CSAMSEGL VALUE)
*C SET CSAMSEGL = POINTER_TO_NEW_MSEG (R8)
*C SET MSEGNEXT.OF.LAST.ONCHAIN= POINTER_TO_NEW_MSEG (R8)
STG R6,OPERAND1 (COMPARISON VALUE)
STG R8,OPERAND1R (REPLACEMENT VALUE)
LA R0,CSSTG
LGR R3,R8
DROP R8
USING MSEGCB,R6
LA R4,MSEGNEXT MSEGNEXT IS IN CSA
STG R4,OPERAND4
STG R8,OPERAND3R
PLO 0,CSAMSEGL,0,PL
* THE FIRST-OPERAND COMPARISON VALUE AND THE SECOND OPERAND ARE
* COMPARED. IF THEY ARE EQUAL, THE FIRST-OPERAND REPLACEMENT VALUE
* IS STORED AT THE SECOND-OPERAND LOCATION, AND THE THIRD OPERAND IS
* STORED AT THE FOURTH-OPERAND LOCATION.
BC 7,DOX378 (BRANCH IF NOT SUCCESSFUL)
*C END
EIFX378 ds 0h
DCSG EQU 9 PLO OPERATION DOUBLE COMPARE AND SWAP
CSSTG EQU 13 PLO OPERATION COMPARE AND SWAP AND STORE
PL DS 0D PLO PARAMETER LIST
ORG PL+8
OPERAND1 DS XL8 COMPARISON VALUE
ORG PL+24
OPERAND1R DS XL8 REPLACEMENT VALUE
ORG PL+40
OPERAND3 DS XL8 COMPARISON VALUE FOR DCSG
ORG PL+56
OPERAND3R DS XL8 NEW CONTROL BLOCK ADDRESS (CSSTG)
* REPLACEMENT VALUE (DCSG)
ORG PL+72
OPERAND4 DS XL8 ADDRESS OF LAST CB POINTER
ORG PL+88
OPERAND5 DS XL8 NEW CONTROL BLOCK ADDRESS
ORG PL+104
OPERAND6 DS XL8 ADDRESS OF NEXT CB POINTER
On the remove from chain side:
*C IF MSEGNEXT = 0
*C SET CSAMSEGL = 0
*C SET CSAMSEGF = 0
XC OPERAND1,OPERAND1 (COMPARISON VALUE)
XC OPERAND1R,OPERAND1R (REPLACEMENT VALUE)
LA R0,CSDSTG
XGR R3,R3
LA R4,CSAMSEGL
STG R4,OPERAND6
LA R4,CSAMSEGF
STG R4,OPERAND4
STG R3,OPERAND3
STG R3,OPERAND5
PLO 0,MSEGNEXT,0,PL
CSDSTG EQU 17 PLO OPERATION COMPARE AND SWAP AND DOUBLE STORE
PL DS 0D PLO PARAMETER LIST
ORG PL+8
OPERAND1 DS XL8 COMPARISON VALUE
ORG PL+24
OPERAND1R DS XL8 REPLACEMENT VALUE
ORG PL+56
OPERAND3 DS XL8 NEW CONTROL BLOCK ADDRESS
ORG PL+72
OPERAND4 DS XL8 ADDRESS OF LAST CB POINTER
ORG PL+88
OPERAND5 DS XL8 NEW CONTROL BLOCK ADDRESS
ORG PL+104
OPERAND6 DS XL8 ADDRESS OF NEXT CB POINTER
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: INFO IBM-MAIN
