TITLE 'FREE CELL ROUTINE -- IEAVFRCL' 00050002 * /* START OF SPECIFICATIONS **** 00050102 * 00060102 *01* MODULE-NAME = IEAVFRCL 00060502 * 00061702 *02* CSECT-NAME = IEAVFRCL 00061802 * 00062002 *01* DESCRIPTIVE-NAME = FREE CELL 00068302 * 00072302 *01* COPYRIGHT = NONE 00074302 *01* STATUS = OS/VS2 RELEASE 3.0/3.7 00084303 * PTF LEVEL UZ15960 00086303 * 00096402 *01* FUNCTION = RETURN A CELL TO A POOL OF CELLS (QUICKCELL POOL). 00097602 * 00099702 *02* OPERATION = THIS ROUTINE WILL RETURN A CELL TO THE QUICKCELL 00099802 * POOL FROM WHICH IT WAS PREVIOUSLY OBTAINED BY THE GETCELL 00101802 * FUNCTION. IT PERFORMS VERIFICATIONS ON THE CELL TO ASSURE THAT 00103802 * IT WAS ALLOCATED FROM THE GIVEN POOL. THIS IS 00105802 * DONE BY LOOKING FOR THE POOL ID (CPID) IN THE LAST WORD OF THE 00107802 * CELL, AND BY CHECKING THAT THE CELL LIES FULLY WITHIN THE 00108202 * BOUNDS OF ONE OF THE POOL EXTENTS. IT FURTHER CHECKS THAT THE 00108302 * CELL IS A PROPER CELL BASED UPON ITS RELATIVE BOUNDARY IN THE 00110902 * POOL EXTENT. IF ANY OF THESE TESTS FAIL, THE CELL WILL NOT BE 00112902 * ACCEPTED. OTHERWISE, IT WILL BE ENQUEUED INTO THE POOL IN 00114902 * PUSH-DOWN FASHION. 00115602 * 00117002 *01* NOTES = STANDARD LINKAGE CONVENTIONS 00117702 * 00120202 *02* DEPENDENCIES = 370R-MP INSTRUCTION SET (CS AND CDS). 00122802 * 00125402 *03* CHARACTER-CODE-DEPENDENCIES = NONE 00128002 *02* RESTRICTIONS = MAY NOT USE REGISTERS 2 THROUGH 13 INCLUSIVE -- 00130602 * THIS IS A DESIGN DESIGN RESTRICTION. 00133202 * 00135802 *02* REGISTER-CONVENTIONS = SEE REGISTER EQUATES AFTER CSECT 00138402 * STATEMENT. 00141002 * 00143602 *02* PATCH-LABEL = NUCLEUS PATCH AREA 00146202 * 00148802 *01* MODULE-TYPE = MACRO-INVOKED PROCESSING SUBROUTINE 00151402 * 00154002 *02* PROCESSOR = ASSEMBLER-370R 00156602 * 00159202 *02* MODULE-SIZE = 350 BYTES 00161802 * 00164402 *02* ATTRIBUTES = REFRESHABLE NUCLEUS RESIDENT 00167002 * 00169602 *01* ENTRY-POINT = IEAVFRCL 00172202 * 00174802 *02* PURPOSE = RETURN A CELL TO A QUICKCELL POOL. 00174902 * 00175602 *02* LINKAGE = ENTERED VIA BALR 14,15 --- THE MACRO FREECELL SHOULD 00176002 * BE USED FOR INVOKATION. REGISTER 0 CONTAINS THE CPID OF THE 00178002 * POOL WHILE REG. 1 CONTAINS THE ADDRESS OF THE CELL TO BE 00180002 * FREED. 00180402 * 00181402 *02* INPUT = A FORMATTED QUICKCELL POOL (IMPLIED) AND AN ALLOCATED 00183402 * CELL. 00183802 * 00184502 *02* OUTPUT = THE CELL RETURNED TO THE POOL, AND A RETURN CODE. 00186402 * 00188802 *02* REGISTERS-SAVED = NONE ... REGISTERS 1 THROUGH 4 AND 15 WILL 00189202 * BE CHANGED. 00189602 *02* REGISTER-USAGE = SEE COMMENTS ON REGISTER EQUATES. 00190102 * 00190302 *02* REGISTERS-RESTORED = NONE 00192202 *01* EXIT-NORMAL = FRCEXIT0 00195002 * 00196002 *02* CONDITIONS = THE CELL HAS BEEN RETURNED. (OPTIONALLY, THE 00196102 * EXTENT CONTAINING THE CELL HAS BEEN DELETED.) 00196202 * 00198602 *02* OUTPUT = WHEN THE RETURN CODE IS 0, REG 0 IS UNCHANGED AND REG 00199302 * 1 = 0. WHEN THE RETURN CODE IS 20, THE ADDRESS OF THE DELETED 00201302 * EXTENT IS IN REG 1, WHILE REG 0 CONTAINS THE SUBPOOL # AND 00201702 * LENGTH OF THE EXTENT. 00202102 * 00203102 *02* RETURN-CODES = 0 = THE CELL HAS BEEN RETURNED 00203502 * 20 = THE EXTENT HAS BEEN DEQUEUED AND THE CELL 00203902 * RETURNED. 00204302 * 00204902 *01* EXIT-ERROR = FRCERR04 00206902 * 00212102 *02* CONDITIONS = THE CELL WAS NOT ALLOCATED FROM THIS POOL. 00212502 * 00213302 *02* OUTPUT = RETURN CODE 00213402 * 00215202 *02* RETURN-CODES = 4 00215602 * 00216902 *01* EXIT-ERROR = FRCERR08 00218902 * 00219302 *02* CONDITIONS = THE CELL DOES NOT BELONG TO ANY EXTENT OF THIS 00219402 * POOL. 00219502 * 00219602 *02* OUTPUT = RETURN CODE 00219702 * 00219902 *02* RETURN-CODES = 8 00220302 * 00220402 *01* EXIT-ERROR = FRCERR12 00220602 * 00222602 *02* CONDITIONS = THE POOL CONTAINS NO EXTENTS OR IS UNFORMATTED. 00222702 * 00222802 *02* OUTPUT = RETURN CODE 00222902 * 00223002 *02* RETURN-CODES = 12 00223402 * 00223802 *01* EXIT-ERROR = FRCERR16 00223902 * 00224002 *02* CONDITIONS = THE CPID REFERENCES AN UNDEFINED POOL. 00224102 * 00224502 *02* OUTPUT = RETURN CODE 00224902 * 00225002 *02* RETURN-CODES = 16 00225102 * 00225202 *01* EXTERNAL-REFERENCES = CVT, GDA AND CPAB 00225302 * 00225602 *02* ROUTINES = NONE 00225702 * 00226002 *02* CONTROL-BLOCKS = CVT AND GDA -- READ ONLY. CPAB (CELL POOL 00226702 * ANCHOR BLOCK) READ AND WRITE. 00227102 * 00227202 *01* TABLES = NONE 00227302 *01* MACROS = NONE 00227702 *02* SERIALIZATION = THE 'CPABFLGW' FIELD IS USED TO SERIALIZE ALL 00229702 * OPERATIONS ON ANY SINGLE POOL EXTENT, REGARDLESS OF THE TYPE 00231702 * OF OPERATION. THIS FIELD IS MANIPULATED WITH THE 'CS' (COMPARE 00232102 * AND SWAP) INSTRUCTION. ONE BIT IN THIS FIELD, 'DELETELK', IS 00232502 * USED TO INDICATE THAT THE EXTENT IS BEING DELETED FROM THE 00232902 * POOL. IF A DELETE IS OCCURING (THE BIT IS 'ON'), ALL OTHER 00233002 * OPERATIONS ARE PROHIBITED ON THE EXTENT BEING DELETED. IF NO 00233102 * DELETE IS OCCURRING, THE USE COUNT 'CPABUSE#' IS USED TO 00233202 * PREVENT A DELETE FROM STARTING IN THE MIDDLE OF SOME OTHER 00233302 * PROCESS. A NON-ZERO VALUE FOR 'CPABUSE#' WILL PREVENT AN 00233402 * EXTENT FROM BEING DELETED. ONCE THE EXTENT HAS BEEN LOCKED 00233502 * AGAINST DELETES, THE DOUBLE-WORD FIELD CONSISTING OF 00234102 * 'CPABDEQC' AND 'CPABFACP' IS USED TO SERIALIZE THE ACQUISITION 00234502 * AND RELEASE OF CELLS IN THE SINGLE EXTENT. THIS DOUBLE-WORD 00234902 * FIELD IS MANIPULATED WITH THE 'CDS' (COMPARE DOUBLE AND SWAP) 00235302 * INSTRUCTION. 00235402 * 00235602 *01* CHANGE-ACTIVITY = NEW FOR OS/VS2 RELEASE 2 - LEVEL 02.00 00236202 * 00236402 * APARS OZ18115 @ZA18115 00236503 * OZ28730 @ZA28730 00236703 * 00236903 *01* MESSAGES = NONE 00237003 *01* ABEND-CODES = NONE 00237302 **** END OF SPECIFICATIONS ***/ 00237902 EJECT 00287702 */*FREECELL: CHART (AMODE) */ 06100002 */* HEADER 06110002 */*DYNAMIC QUICKCELL FUNCTION 06120002 */* FREE CELL ROUTINE 06140002 */* 06142002 */* PAGE # */ 06144002 */*IEAVFRCL:1A1 E (,%D1) BRANCH ENTRY */ 06150002 */*%D1:1B1 D (YES,PERMCPID,NO,%D2) PERMANENT CPID? */ 06200002 */*%D2:1B2 D (YES,FRCERR16,NO,%DYN) NULL CPID (=0)? */ 06250002 */*PERMCPID: P (,GOTCPAB) GET INDEX INTO CPAB TABLE FOR CPAB */ 06300002 */*%DYN:1B3 P (,GOTCPAB) COMPUTE CPAB ADDRESS */ 06350002 */*GOTCPAB: D (NO,FRCERR16,YES,%D5) CPID MATCH ONE IN CPAB? */ 06400002 */*%D5:1E1 D (NO,FRCERR12,YES,%D6) IS THE POOL FORMATTED? */ 06500002 */*%D6:1F1 D (NO,FRCERR4,YES,CPABLOOP) IS THIS AN ALLOCATED CELL? 06600002 */* */ 06650002 */*CPABLOOP: D (NO,GNXTCPAB,YES,%BNDRY) CELL WITHIN THIS POOL 06700002 */*EXTENT? */ 06710002 */*GNXTCPAB: D (NO,FRCERR08,YES,%CHN) ANY OTHER EXTENTS? */ 06750002 */*FRCERR08: R RC=8 */ 06800002 */*%CHN:1D3 M (,CPABLOOP) GET NEXT EXTENT ADDRESS */ 06850002 */*%BNDRY: P (,%BNDRYT) COMPUTE RELATIVE ADDRESS OF THE CELL IN 06900002 */*THE EXTENT */ 06910002 */*%BNDRYT: D (YES,DLCKCHK,NO,FRCERR08) CELL ON INTEGRAL BOUNDARY 06920002 */*? */ 06930002 */*DLCKCHK: D (ON,FRCEXIT0,OFF,%INCR) TEST DELETE IN PROCESS FLAG 06950002 */**/ 06952002 */*%INCR: P (,ENQLOOP) LOCK OUT DELETE (RAISE USE COUNT) */ 06960002 */*ENQLOOP: M (,%CDS) SET UP FOR 'CDS' TO ENQUEUE THE CELL */ 07000002 */*%CDS:1J3 D (YES,UNLCKLP,NO,ENQLOOP) CDS-DID THE STORE OCCUR? 07050002 */**/ 07052002 */*UNLCKLP: P (,%ADELCHK) UNLOCK THIS EXTENT - LOWER USE COUNT. */ 07052402 */*%ADELCHK: D (NO,FRCEXIT0,YES,%EMPTY) AUTO-DELETE CANDIDATE ? */ 07054002 */*%EMPTY: D (NO,FRCEXIT0,YES,%REM1) ALL CELLS RETURNED ? 07054402 */**/ 07054802 */*%REM1: D (NO,FRCEXIT0,YES,%REMOV) LAST EXTENT ? */ 07056002 */*%REMOV: P (,%DELGET) LOCK THE EXTENT AGAINST OTHER OPERATIONS 07058002 */**/ 07058102 */*%DELGET: D (YES,DEQUEIT,NO,FRCEXIT0) IS IT LOCKED NOW? */ 07058202 */*DEQUEIT: P (,FRCERR20) DELETE THE LAST EXTENT */ 07058402 */*FRCERR20: P (,%EXIT20) SET UP REGISTERS 0 AND 1 TO ALLOW FREEMAIN 07058802 */* BY CALLER */ 07059202 */*%EXIT20: R RC=20 */ 07059602 */*FRCEXIT0: R RC=0 --NORMAL-- */ 07150002 */*FRCERR4: R RC=4 */ 07152002 */*FRCERR12: R RC=12 */ 07154002 */*FRCERR16: R RC=16 */ 07160002 */*IEAVFRCL: END */ 07200002 EJECT 07210002 IEAVFRCL CSECT 07250002 CELLLINK EQU 0 CELL LINKAGE POINTER 07300002 CLINKLEN EQU 4 CELL LINKAGE POINTER FIELD LENGTH 07350002 R0 EQU 0 CPID -- INPUT PARAMETER 07400002 R1 EQU 1 CELL ADDRESS -- INPUT PARAMETER 07450002 @R2 EQU 2 SCRATCH REGISTER 07500002 @R3 EQU 3 SCRATCH REGISTER 07550002 * ON INPUT, R3 CONTAINS CVT ADDRESS 07600002 R4 EQU 4 CPAB ADDRESS (CALCULATED) 07650002 * NOTE: REGISTERS 5 THROUGH 13 ARE EXPLICITLY FORBIDDEN FOR USE *07652002 BY THIS ROUTINE 07654002 R14 EQU 14 RETURN ADDRESS 07700002 R15 EQU 15 ENTRY POINT ADDRESS (BASE REGISTER) 07750002 USING IEAVFRCL,R15 07800002 MODID BR=YES 07810002 LTR R4,R0 TEST CPID VALUE AND SET CPAB ADDRESS BASE 07850002 BM PERMCPID NEGATIVE, PERMANENT (SYSTEM) CPID 07900002 BZ FRCERR16 NULL (=0), ERROR CONDITION 07950002 *********************************************************************** 07960002 * THE CPID HAS BEEN FOUND TO BE A DYNAMIC POOL ID AND 08000002 * THE ADDRESS OF THE FIRST CPAB IS FOUND FROM THE CPID 08050002 * BY MULTIPLYING IT BY 4. 08100002 * SINCE R4 ALREADY CONTAINS THE CPID, MULTIPLY BY 4 08150002 *********************************************************************** 08160002 SLL R4,2 GET THE CPAB BASE REGISTER 08200002 B GOTCPAB CONTINUE COMMON PROCESSING. 08250002 EJECT 08300002 *********************************************************************** 08310002 * A PERMANENT (SYSTEM) CPID HAS BEEN PASSED, THE CPAB 08350002 * ADDRESS IS FOUND BY USING THE LOW-ORDER BYTE OF THE 08400002 * ID AS AN INDEX INTO A TABLE OF CPAB'S. THE TABLE IS 08450002 * FOUND FROM THE GLOBAL DATA AREA (GDA), WHOSE ADDRESS 08500002 * IS FOUND IN THE CVT. 08550002 *********************************************************************** 08560002 PERMCPID EQU * 08600002 USING CVT,@R3 08650002 L @R3,CVTGDA ADDRESS OF THE GLOBAL DATA AREA 08700002 USING GDA,@R3 08750002 * REG. 4 ALREADY CONTAINS THE CPID, SO THE CPAB ADDRESS = CPID 08850002 N R4,F255 // 256 (MODULO DIVISION) 08900002 SLL R4,5 * 32 (CPAB LENGTH) 08950002 A R4,PFSTCPAB + CPAB TABLE ADDRESS 09000002 ***** NOTE: THE PREVIOUS CALCULATION IS DEPENDENT UPON THE LENGTH OF*09010002 THE CPAB REMAINING AT 32. 09020002 SPACE 3 09050002 *********************************************************************** 09060002 * COMMON PATH******** AFTER FINDING THE CPAB FOR THE 09100002 * ID GIVEN, CHECK FOR MATCHING CPID'S, UNFORMATTED 09150002 * POOLS, AND UNALLOCATED (NOT GETCELL'ED) CELLS. 09200002 *********************************************************************** 09202002 GOTCPAB EQU * 09210002 USING CPAB,R4 09250002 C R0,CPABCPID DO THE CPID'S MATCH ? 09300002 BNE FRCERR16 NO, ERROR CONDITION 09350002 L @R2,CPABSTAD YES, GET POOL START ADDRESS 09400002 LTR @R2,@R2 HAS THE POOL EVER BEEN FORMATTED? 09450002 BZ FRCERR12 NO, ERROR CONDITION 09500002 L @R3,CPABCSZE YES, GET THE CELL SIZE FROM THE CPAB 09550002 C R0,CELLLINK(@R3,R1) HAS THE CELL BEEN ALLOCATED 09600002 * FROM THIS POOL? (CONTAIN THIS CPID?) 09650002 BNE FRCERR04 NO, ERROR CONDITION 09700002 EJECT 09750002 *********************************************************************** 09760002 * THE CELL HAS BEEN SHOWN TO BELONG TO THIS POOL AND 09800002 * THE POOL IS KNOWN TO BE FORMATTED, NOW FIND THE 09850002 * SEGMENT (EXTENT) OF THE POOL TO WHICH THE CELL BELONGS. 09900002 *********************************************************************** 09910002 CPABLOOP EQU * 09950002 C R1,CPABSTAD CHECK CELL AGAINST LOW BOUND 10000002 BL GNXTCPAB OUT OF BOUNDS, GET NEXT EXTENT 10050002 LA @R2,CLINKLEN(@R3,R1) SET UP ADDRESS OF END OF CELL 10100002 C @R2,CPABENAD TEST CELL END AGAINST UPPER BOUND 10150002 BH GNXTCPAB OUT OF BOUNDS, TRY NEXT EXTENT 10200002 SPACE 2 10250002 *********************************************************************** 10260002 * THE EXTENT HAS BEEN FOUND TO WHICH THE CELL BELONGS. 10300002 * CHECK TO SEE THAT THE CELL IS ON AN INTEGRAL BOUNDARY 10350002 * WITHIN THAT EXTENT. 10400002 ********* FROM NOW ON, THE CPID IS NOT AVAILABLE IN A 10450002 * REGISTER, AND REGISTER 0 WILL CONTAIN VARYING 10500002 * DATA. 10550002 *********************************************************************** 10560002 LA R0,CLINKLEN(@R3) R0 = COMPLETE CELL SIZE - LINK 10600002 * WORD LENGTH (4) IS INCLUDED 10650002 LR @R3,R1 CELL ADDRESS 10700002 S @R3,CPABSTAD - START ADDRESS OF THE POOL 10750002 BZ SKIPDVD GIVES THE RELATIVE ADDRESS 10800002 * OF THE CELL IN THE POOL. IF 10850002 * IT IS ZERO, SKIP DIVISION. 10900002 SR @R2,@R2 CLEAR FOR DIVISION 10950002 DR @R2,R0 DIVIDE BY CELL LENGTH 11000002 LTR @R2,@R2 IF REMAINDER IS ZERO, CELL IS 11050002 * ON AN INTEGRAL BOUNDARY. 11100002 BNZ FRCERR08 IF NOT, ERROR CONDITION 11150002 SKIPDVD EQU * 11200002 SPACE 2 11300002 *********************************************************************** 11310002 * NOW THAT THE EXTENT TO WHICH THE CELL BELONGS IS KNOWN, 11350002 * CHECK TO SEE IF IS BEING DELETED BEFORE ALLOWING THE CELL 11400002 * TO BE STORED. 11500002 *********************************************************************** 11510002 DLCKCHK EQU * 11550002 L @R2,CPABFLGW GET LOCKING FLAGS AND USE COUNT 11600002 DLCKCHK2 EQU * 11620002 LR @R3,@R2 COPY THEM FOR TESTING 11650002 N @R3,DLFLGOFF TURN OFF DELETE FLAG IN COPY 11700002 CR @R2,@R3 IF THEY ARE THE SAME, THE DELETE LOCK 11750002 * WAS ALREADY OFF. 11800002 BNE FRCEXIT0 OTHERWISE A DELETE IS IN PROCESS 11850002 ****** NOTE **** A LOAD ADDRESS (LA) INSTRUCTION CANNOT BE USED HERE, 11860002 * SINCE THE FIELD BEING INCREMENTED CONTAINS THE SUBPOOL ID IN 11870002 * ITS HIGH-ORDER BYTE. 11880002 LR @R3,@R2 NO DELETE GOING ON, LOCK OUT DELETE 11900002 A @R3,F1 BY RAISING THE OPERATION COUNT. 11950002 CS @R2,@R3,CPABFLGW STORE LOCKS IF NOTHING HAS 12000002 * HAPPENED TO CHANGE THE STATUS. 12050002 BNE DLCKCHK2 STATUS CHANGED, SEE WHY. 12100002 SPACE 2 12150002 *********************************************************************** 12160002 * NO DELETES ARE IN PROCESS AND DELETE IS LOCKED OUT OF 12200002 * THIS EXTENT, RESTORE THE CELL TO THE POOL. 12250002 *********************************************************************** 12260002 ENQLOOP EQU * 12300002 LM @R2,@R3,CPABDEQC GET DEQUEUE COUNT AND FIRST 12350002 * AVAILABLE CELL POINTER FROM 12400002 * THE CPAB. 12450002 ENQLOOP2 EQU * 12470002 A R1,CPABCSZE GET LINK POINTER ADDRESS FOR THE 12500002 * CELL BEING RETURNED. 12550002 ST @R3,CELLLINK(R1) PUSH-DOWN THE PRIOR FIRST CELL 12600002 S R1,CPABCSZE CONVERT ADDRESS BACK TO THAT OF THE CELL 12650002 LR R0,@R2 REDUCE THE DEQUEUE COUNT BY 1 TO 12700002 BCTR R0,R0 ASSURE SERIALIZATION OF THE CDS 12750002 CDS @R2,R0,CPABDEQC ENQUEUE THE CELL IN THE POOL 12800002 BNE ENQLOOP2 ENQUEUE FAILED, TRY AGAIN 12850002 SPACE 3 12900002 *********************************************************************** 12910002 * THE CELL HAS BEEN SUCCESSFULLY RETURNED TO THE POOL, 12950002 * TAKE OFF THE LOCK ON THE POOL EXTENT (BY REDUCING THE USE 13000002 * COUNT). 13004002 *********************************************************************** 13010002 UNLCKLP EQU * 13050002 L @R2,CPABFLGW GET THE LOCKING FLAGS AND USE COUNT 13100002 UNLCKLP2 EQU * 13120002 LR @R3,@R2 COPY THEM 13150002 BCTR @R3,0 REDUCE THE USE COUNT 13200002 CS @R2,@R3,CPABFLGW UNLOCK THE EXTENT (STORE THE UPDATED 13250002 BNE UNLCKLP2 LOCK). IF THE STORE FAILED, TRY AGAIN 13300002 EJECT 13320002 *********************************************************************** 13320402 * THE CELL THAT WAS RETURNED MAY HAVE CAUSED THE ENTIRE EXTENT 13322002 * TO BECOME FREE OF ALLOCATED CELLS. IF THIS WAS THE CASE, AND 13324002 * THE USER CHOSE THE 'AUTOMATIC DELETE OPTION', THEN THIS 13326002 * EXTENT WILL BE RELEASED, PROVIDED THAT EITHER: 13327003 * (1) THIS IS THE LAST EXTENT AND IS NOT THE ORIGINAL @ZA28730 13327103 * EXTENT, OR @ZA28730 13327203 * (2) THE CALLER HAS GUARANTEED THAT THE CHAIN OF @ZA28730 13327303 * EXTENTS IS PROPERLY SERIALIZED AND THIS IS NOT @ZA28730 13327403 * THE ORIGINAL EXTENT. @ZA28730 13327503 * 13328603 * FOR ANY OTHER CONDITIONS, THE NORMAL RETURN IS TAKEN AND THE 13328703 * EXTENT IS NOT DELETED. 13328803 *********************************************************************** 13328902 TM CPABFLGS,ADELCAND+CPABEXTN 13329202 BNO FRCEXIT0 EXIT, EITHER NOT AN EXTENT OR NOT 13329602 * MARKED AS AN AUTO-DELETE CANDIDATE. 13329702 LTR R0,R0 TEST THE DEQUEUE COUNT FOR 0 13329802 BNZ FRCEXIT0 THE EXTENT IS NOT FREE, EXIT 13329902 LR @R2,@R3 SAVE SP # IN CASE SERIAL SPECF'D @ZA28730 13330403 TM CPABFLGS,SERIAL IS SERIALIZATION GUARANTEED? @ZA28730 13331103 BO ORGADDR YES, GO DEQUEUE THE EXTENT @ZA28730 13331803 L @R2,CPABNXTP GET NEXT EXTENT POINTER 13333202 LTR @R2,@R2 IS THIS THE LAST EXTENT? 13335202 BNZ FRCEXIT0 NO, THERE IS ANOTHER, EXIT 13335602 SPACE 2 13336002 *********************************************************************** 13336102 * IN ADDITION TO THE ABOVE, THE USE COUNT OF THE EXTENT @ZA18115 13337103 * MUST ALSO BE 0. THE 'CS' BELOW CHECKS FOR A 0 USE @ZA18115 13338103 * COUNT AND IF IT IS 0, TURNS ON THE DELETE LOCK FLAG. @ZA18115 13339103 * ALL THE PREREQUISITES FOR AN AUTO-DELETE HAVE BEEN SATISFIED. 13345103 * DELCPOOL WOULD NOW BE INVOKED TO FREE THE EXTENT WITHOUT 13345603 * FREEMAINING THE CORE IT OCCUPIES. THE CALLER WILL BE NOTIFIED 13346103 * AND WILL RECEIVE SUFFICIENT INFORMATION FOR EXECUTING THE 13347102 * FREEMAIN HIMSELF. 13357102 * NOTE: SINCE THE INVOKATION OF DELCPOOL REQUIRES A SAVE AREA & 13358802 * NONE IS AVAILABLE TO THIS ROUTINE, THE DELETION OF THE POOL 13359602 * IS ACCOMPLISHED BY THIS MODULE DIRECTLY. 13360002 *********************************************************************** 13360602 N @R3,ZEROUSE ONLY SET DELETE LOCK FLAG @ZA18115 13362203 * IF THE USE COUNT IS ZERO @ZA18115 13362403 LR @R2,@R3 COPY THE LOCKING FLAGS 13362503 O @R2,DELETEON SET THE DELETE LOCK FLAG ON 13362603 CS @R3,@R2,CPABFLGW SEIZE THE EXTENT (IF POSSIBLE) 13362903 BNE FRCEXIT0 IN USE, RETURN 13363002 EJECT 13363103 *********************************************************************** 13363303 * ALTHOUGH THE USE COUNT WAS ZERO AT THE TIME OF THE 'CS', 13365303 * A GETCELL COULD HAVE BEEN COMPLETELY EXECUTED ON THIS 13367303 * EXTENT BETWEEN NOW AND THE TIME THAT THE DEQUEUE 13371803 * COUNT WAS LAST CHECKED. THEREFORE, WITH THE DELETE LOCK 13371903 * NOW SET, THE DEQUEUE COUNT MUST BE CHECKED AGAIN. IF IT 13372003 * IS STILL ZERO, THE EXTENT CAN BE SAFELY DELETED. IF NOT, 13372103 * THE EXTENT MUST BE UNLOCKED. @ZA18115 13372203 *********************************************************************** 13372303 L @R3,CPABDEQC GET COUNT OF DEQUEUED CELLS @ZA18115 13372403 LTR @R3,@R3 ANY CELLS IN USE ? @ZA18115 13372503 BNZ RESETDLK YES, TURN OFF DELETE LOCK @ZA18115 13372603 ORGADDR L R1,CPABCPID GET ADDRESS OF ORIGINAL CPAB @ZA28730 13372703 PREDSRCH EQU * 13373603 C R4,CPABNXTP-CPAB(R1) IS THIS THE PREDECESSOR? 13373802 BE DEQUEIT YES, REMOVE THE CPAB FROM THE CHAIN 13375802 L R1,CPABNXTP-CPAB(R1) NO, GET THE NEXT CPAB 13377802 B PREDSRCH AND CONTINUE THE SEARCH 13379102 DEQUEIT EQU * 13379202 MVC CPABNXTP-CPAB(L'CPABNXTP,R1),CPABNXTP DEQUEUE THE CPAB 13381502 LR R0,@R2 PASS THE SUBPOOL NUMBER 13383502 ICM R0,ADDRPART,CPABENAD+1 THE EXTENT SIZE 13383602 S R0,CPABSTAD = (END ADDR - START ADDR) 13383802 A R0,FCPABLEN ADD THE CPAB LENGTH. 13383902 LR R1,R4 PASS BACK THE EXTENT ADDRESS 13384202 LA R15,20 SET AUTO-DELETE RETURN CODE 13384402 BR R14 RETURN TO CALLER 13386202 EJECT 13388502 *********************************************************************** 13388603 * ALTHOUGH THIS INVOCATION OF FREE CELL RETURNED THE LAST 13388703 * ALLOCATED CELL TO THE EXTENT, AND ALTHOUGH THE USE COUNT 13388803 * WAS ZERO AT THE TIME THAT THE DELETE LOCK FLAG WAS 'CS'D' 13388903 * ON, A CELL WAS RE-ALLOCATED FROM THE EXTENT AT SOME POINT 13389603 * AFTER THE DEQUEUE COUNT WAS FIRST CHECKED FOR ZERO, AND THE 13389703 * TIME THAT THE DELETE LOCK WAS SET ON. THEREFORE, THE EXTENT 13389803 * CANNOT BE DELETED, AND THE DELETE LOCK MUST BE TURNED OFF. 13389903 * @ZA18115 13390003 *********************************************************************** 13390103 RESETDLK EQU * @ZA18115 13390203 NI CPABFLGS,UNLOCK TURN OFF DELETE LOCK FLAG @ZA18115 13390303 SPACE 13390403 *********************************************************************** 13390502 * SINCE A POOL BEING DELETED EFFECTS THE FREEING OF THE 13390802 * CELL, IF A DELETE WAS IN PROCESS AND THE CELL BELONGED 13393102 * TO THE EXTENT BEING DELETED, A NORMAL RETURN IS TAKEN. 13395402 * 13397702 * THE CELL HAS BEEN SUCCESSFULLY RETURNED TO THE POOL, AND 13400002 * THE POOL IS UNLOCKED, RETURN TO THE USER. 13450002 *********************************************************************** 13452002 FRCEXIT0 EQU * 13460002 TM CPABFLGS,CPABEXTN IS THE PRESENT CPAB THE ORIGINAL ? 13461002 BZ ORIGINAL YES, THE CPID IS IN CPABCPID. 13462002 L R4,CPABCPID NO, GET THE ADDRESS OF THE ORIGINAL CPAB. 13463002 ORIGINAL EQU * 13464002 L R0,CPABCPID GET THE CPID OF THE POOL (RETURN PARM). 13465002 SR R1,R1 CLEAR REG 1 (REMOVE CELL ADDRESSABILITY) 13470002 SR R15,R15 SET RETURN CODE = 0 13500002 BR R14 RETURN TO THE CALLER 13550002 SPACE 13600002 *********************************************************************** 13610002 * IF THE CELL DID NOT BELONG IN THE EXTENT UNDER INVESTIGATION 13650002 * AND THERE ARE MORE EXTENTS TO CHECK, CONTINUE THE SEARCH 13700002 * FOR THE EXTENT TO WHICH THE CELL DOES BELONG. 13750002 *********************************************************************** 13760002 GNXTCPAB EQU * 13800002 L R4,CPABNXTP ADDRESS OF THE NEXT CPAB 13850002 LTR R4,R4 IF IT IS ZERO, THERE ARE NO MORE 13900002 * EXTENTS. 13950002 BNZ CPABLOOP OTHERWISE, CONTINUE THE SEARCH. 14000002 B RETCDEQ8 NO MORE EXTENTS, SET ERROR RETURN CODE. 14020002 EJECT 14030003 *********************************************************************** 14060002 * IF THERE ARE NO MORE EXTENTS AND THE CELL HAS NOT BEEN 14100002 * RETURNED, THERE IS AN ERROR AND A CODE OF 8 IS RETURNED. 14150002 *********************************************************************** 14160002 FRCERR08 EQU * 14200002 TM CPABFLGS,CPABEXTN IS THE PRESENT CPAB THE ORIGINAL ? 14208002 BZ ORIGCPAB YES, THE CPID IS IN CPABCPID. 14216002 L R4,CPABCPID NO, GET THE ADDRESS OF THE ORIGINAL CPAB. 14224002 ORIGCPAB EQU * 14232002 L R0,CPABCPID GET THE CPID OF THE POOL (RETURN PARM). 14240002 RETCDEQ8 EQU * 14245002 LA R15,8 14250002 BR R14 RETURN 14300002 SPACE 14320003 *********************************************************************** 14360002 * THE CELL WAS NOT ALLOCATED FROM THIS POOL (THE CPID IN THE 14400002 * CELL DOES NOT MATCH THE CPID OF THE POOL). 14450002 *********************************************************************** 14460002 FRCERR04 EQU * 14500002 LA R15,4 14550002 BR R14 14600002 SPACE 14650002 *********************************************************************** 14660002 * THIS POOL HAS NOT BEEN FORMATTED, RETURN AN ERROR CODE 14700002 * THIS CONDITION ONLY APPLIES TO PERMANENT CPIDS, WHERE THE 14702002 * ANCHOR BLOCK EXISTS IN AN ESTABLISHED TABLE OF CPABS. 14704002 *********************************************************************** 14710002 FRCERR12 EQU * 14750002 LA R15,12 14800002 BR R14 RETURN 14850002 SPACE 14900002 *********************************************************************** 14910002 * AN INVALID CPID HAS BEEN GIVEN, NO POOL HAVING THIS CPID 14950002 * HAS EVER BEEN DEFINED TO THE SYSTEM. ---- ERROR RETURN. 14952002 *********************************************************************** 14960002 FRCERR16 EQU * 15000002 LA R15,16 15050002 BR R14 RETURN 15100002 EJECT 15150002 *********************************************************************** 15160002 * CONSTANTS REQUIRED BY THE FREE CELL SERVICE ROUTINE 15200002 *********************************************************************** 15210002 F255 DC F'255' USED FOR MODULO DIVIDE BY 256 15250002 F1 DC F'1' USED TO INCREMENT USE COUNT 15250402 ZEROUSE DC X'FFFF0000' MASK TO ZERO EXTENT USE COUNT @ZA18115 15251403 * THESE NEXT TWO FIELDS ARE USED TO TURN THE DELETE LOCK 15253402 * OFF AND ON (RESPECTIVELY), WHEN THE FLAG WORD IS IN A REGISTER 15256402 DLFLGOFF DC X'FF',AL1(X'FF'-DELETELK),2X'FF' TURN IT OFF 15257403 DELETEON DC AL2(DELETELK,0) TURN IT ON 15270002 FCPABLEN DC A(CPABLEN) LENGTH OF THE ANCHOR BLOCK 15280002 ADDRPART EQU 7 MASK USED TO OBTAIN ADDRESS VIA 'ICM' 15290002 UNLOCK EQU X'F7' MASK FOR RESETTING DELETE LOCK @ZA18115 15295003 CVT DSECT 15300002 CVT 15350002 EJECT 15360002 IHAGDA DSECT=YES 15400002 EJECT 15410002 IHACPAB DSECT=YES 15450002 END 15550002