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

Reply via email to