I posted before on this issue and you all were a great help because I was using
CS and PLO to serialize. However I changed the code and the issue still exists.
The issue looks like, I create a control block but it does not get added to the
chain… I think the term is orphan. The control block structure is above the
bar, FIFO, and has a first and last pointer. The entries in the chain are
removed by one address space and added-to in many address spaces.
Here is the code to add the control block to the chain:
*C R8 = address of newly built control block
DOX378 DS 0H
*C SET R6 = LAST_CONTROL_BLOCK_ADDR
LG R6,LAST_CONTROL_BLOCK_ADDR
*C IF FIRST_CONTROL_BLOCK_ADDR AND LAST_CONTROL_BLOCK_ADDR EQ 0
*C SET FIRST_CONTROL_BLOCK_ADDR AND LAST_CONTROL_BLOCK_ADDR = NEW
Control_block ADDRESS
STG R8,OPERAND1R (REPLACES LAST_CONTROL_BLOCK_ADDR)
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,FIRST_CONTROL_BLOCK_ADDR
STG R4,OPERAND4
PLO 0,LAST_CONTROL_BLOCK_ADDR,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.
*
*C ELSE
BC 8,EDOX378 (if success ... done)
*C IF LAST_CONTROL_BLOCK_ADDR = R6 (ORIGINAL LAST_CONTROL_BLOCK_ADDR VALUE)
*C SET LAST_CONTROL_BLOCK_ADDR = POINTER_TO_NEW_MSEG (R8)
*C SET NEXT_CONTROL_BLOCK_ADDRESS.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,NEXT_CONTROL_BLOCK_ADDRESS NEXT_CONTROL_BLOCK_ADDRESS IS IN
CSA
STG R4,OPERAND4
STG R8,OPERAND3R
PLO 0,LAST_CONTROL_BLOCK_ADDR,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.
BNZ DOX378 (if not successful start over)
EDOX378 DS 0H
Here is the code to remove the control block from the chain.
*C IF NEXT_CONTROL_BLOCK_ADDRESS = 0
*C SET LAST_CONTROL_BLOCK_ADDR = 0
*C SET FIRST_CONTROL_BLOCK_ADDR = 0
XC OPERAND1,OPERAND1 (COMPARISON VALUE)
XC OPERAND1R,OPERAND1R (REPLACEMENT VALUE)
LA R0,CSDSTG
XGR R3,R3
LA R4,LAST_CONTROL_BLOCK_ADDR
STG R4,OPERAND6
LA R4,FIRST_CONTROL_BLOCK_ADDR
STG R4,OPERAND4
STG R3,OPERAND3
STG R3,OPERAND5
PLO 0,NEXT_CONTROL_BLOCK_ADDRESS,0,PL
* OPERAND1 IS COMPARED TO NEXT_CONTROL_BLOCK_ADDRESS.
* IF EQUAL, OPERAND1R IS MOVED TO NEXT_CONTROL_BLOCK_ADDRESS.
* OPERAND3 IS MOVED TO WHERE OPERAND 4 POINTS
* OPERAND5 IS MOVED TO WHERE OPERAND 6 POINTS
* IF NOT EQUAL, SET OPERAND1 = NEXT_CONTROL_BLOCK_ADDRESS VALUE.
*C ELSE
BNZ ELIFM045 (if not successful... means next control
block address not zero)
B EIFM045
ELIFM045 DS 0H
*C SET FIRST_CONTROL_BLOCK_ADDR = NEXT_CONTROL_BLOCK_ADDRESS
MVC FIRST_CONTROL_BLOCK_ADDR,NEXT_CONTROL_BLOCK_ADDRESS (Not
serialized because only update by add process when it is zero and the unchain
process is the only place it is set to zero)
EIFM045 DS 0H
I know this has been successfully performed by others, in fact there probably
should be some standard way to do this, however I have not found it. Any help
is appreciated. I am at a loss.
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: INFO IBM-MAIN