TITLE 'DELETE QUICKCELL POOL MODULE --- IEAVDELP' 00022102 * /* START OF SPECIFICATIONS **** 00024102 * 00026102 *01* MODULE-NAME = IEAVDELP 00030102 * 00044102 *02* CSECT-NAME = IEAVDELP 00046102 * 00048502 *01* DESCRIPTIVE-NAME = DELETE QUICKCELL POOL 00048902 * 00049702 *01* COPYRIGHT = NONE 00049802 *01* STATUS = LEVEL 02.00 -- 2/26/73 00059302 * 00059802 *01* FUNCTION = DELETION OF ALL OR PART OF A QUICKCELL POOL. 00059902 * 00070002 *02* OPERATION = THE DELETE CELL POOL FUNCTION FINDS THE LAST 00072002 * EXTENT OF A POOL OF CELLS AND THEN REMOVES IT FROM THE POOL. 00074002 * AT THIS POINT, IT WILL EITHER FREEMAIN THE STORAGE OR ENQUEUE 00076002 * IT FOR USER FREEMAINING, BASED UPON A USER SELECTED OPTION. IT 00076402 * WILL CONTINUE TO DELETE EXTENTS ONE AT A TIME, WORKING TOWARDS 00076502 * THE START OF THE POOL, UNTIL IT HAS SATISFIED THE CALLER'S 00076602 * REQUEST FOR NUMBER OF EXTENTS TO BE DELETED. (NUMBER IS ONE, 00076702 * ALL EXTENTS, OR THE WHOLE POOL). 00078502 * 00080802 *01* NOTES = STANDARD LINKAGE CONVENTIONS. 00082602 * 00084402 *02* DEPENDENCIES = 370-MP INSTRUCTION SET (COMPARE-AND-SWAP) 00086202 * 00088002 *03* CHARACTER-CODE-DEPENDENCIES = NONE 00089802 *02* RESTRICTIONS = NONE 00091602 *02* REGISTER-CONVENTIONS = SEE EQUATES OF REGISTERS FOLLOWING 00093402 * CSECT STATEMENT 00095202 * 00097002 *02* PATCH-LABEL = NUCLEUS PATCH AREA 00098802 * 00100602 *01* MODULE-TYPE = MACRO-INVOKED PROCESSING SUBROUTINE 00102402 * 00104202 *02* PROCESSOR = ASSEMBLER-370R 00106002 * 00107802 *02* MODULE-SIZE = 400 BYTES 00109802 * 00114202 *02* ATTRIBUTES = NUCLEUS REFRESHABLE 00114602 * 00116202 *01* ENTRY-POINT = IEAVDELP 00116602 * 00121502 *02* PURPOSE = DELETION OF THE LAST EXTENT OR ALL EXTENTS OF A 00123502 * QUICKCELL POOL, OR DELETION OF THE ENTIRE POOL ... FREEMAINING 00125502 * OF THE DELETED EXTENTS IS OPTIONAL WITH ANY FORM OF DELETION. 00126002 * 00129202 *02* LINKAGE = ENTERED VIA A BALR 14,15 .. SHOULD BE INVOKED BY THE 00129702 * DELCPOOL MACRO INSTRUCTION. REG 0 CONTAINS THE CPID OF THE 00130102 * POOL TO BE ACTED UPON, AND REG 1 CONTAINS THE OPTION CODE. 00130502 * 00131702 *02* INPUT = NONE 00132202 *02* OUTPUT = A MODIFIED CPAB QUEUE ... SEE SPECIFIC EXITS FOR 00135402 * PARTICULARS 00135802 * 00136202 *02* REGISTERS-SAVED = THIS ROUTINE SAVES NO REGISTERS. THE MACRO 00136702 * EXPANSION (DELCPOOL) PRESERVES 2 THRU 12. 00137102 * 00137702 *02* REGISTER-USAGE = REGISTER USAGE IS DESCRIBED ON THE EQUATES 00138202 * DEFINING THE REGISTER NAMES. 00138602 * 00139202 *02* REGISTERS-RESTORED = NONE ... SEE REGISTERS SAVED. 00139702 *01* EXIT-NORMAL = DELEXIT0 00141202 * 00144002 *02* CONDITIONS = NORMAL RETURN VIA BR R14 00144102 * 00144302 *02* OUTPUT = REGISTER 1 ADDRESSES THE FIRST DEQUEUED BUT 00145002 * UN-FREEMAINED EXTENT. THE FIRST TWO WORDS OF THE EXTENT 00145402 * CONTAIN ITS SUBPOOL NUMBER AND LENGTH, FOLLOWED BY THE ADDRESS 00145802 * OF THE NEXT DEQUEUED BUT UN-FREEMAINED EXTENT (IF ANY)... THE 00146202 * FIELD = 0 IF NO FURTHER EXTENTS. 00146602 * 00146702 *02* RETURN-CODES = 0 = SUCCESSFUL COMPLETION 00146802 * 00147402 *01* EXIT-ERROR = DELERR04 00147802 * 00159702 *02* CONDITIONS = ERROR DURING FREEMAIN OF A DELETED EXTENT. 00161702 * 00164102 *02* OUTPUT = REG 0 = REASON CODE (FREEMAIN ERROR CODE). 00164702 * REG 1 = ADDRESS OF EXTENT IN ERROR... THE FIRST 00166702 * WORD OF THE EXTENT CONTAINS THE SUBPOOL NUMBER AND 00168702 * LENGTH OF THE EXTENT. 00169102 * 00170002 *02* RETURN-CODES = 4 00172002 * 00174402 *01* EXIT-ERROR = DELERR08 00175602 * 00176002 *02* CONDITIONS = ATTEMPT TO DELETE A 'NIP' CREATED POOL. 00176102 * 00176202 *02* OUTPUT = RETURN CODE 00176302 * 00181602 *02* RETURN-CODES = 8 00183602 * 00183702 *01* EXIT-ERROR = DELERR12 00183802 * 00184102 *02* CONDITIONS = ATTEMPT TO DELETE AN UNFORMATTED POOL. 00184502 * OR AN ATTEMPT TO DELETE AN EXTENT ON A POOL THAT HAS NO 00184602 * EXTENTS. 00185002 * 00185402 *02* OUTPUT = RETURN CODE 00187802 * 00188602 *02* RETURN-CODES = 12 00189402 * 00190202 *01* EXIT-ERROR = DELERR16 00191002 * 00191802 *02* CONDITIONS = INVALID CPID PASSED OR NULL CPID (=0). 00192602 * 00193402 *02* OUTPUT = RETURN CODE 00194202 * 00195002 *02* RETURN-CODES = 16 00195802 * 00196602 *01* EXIT-ERROR = DELERR20 00197402 * 00198202 *02* CONDITIONS = CONCURRENT MUTUALLY EXCLUSIVE OPERATION TAKING 00199002 * PLACE ON THIS EXTENT. EITHER A BLDCPOOL, GETCELL OR FREECELL 00199802 * IS CURRENTLY OPERATING ON THIS EXTENT. 00200602 * 00201402 *02* OUTPUT = RETURN CODE 00202202 * 00203002 *02* RETURN-CODES = 20 00203802 * 00204602 *01* EXTERNAL-REFERENCES = CVT, GDA, CPAB 00205402 * 00206202 *02* ROUTINES = SVC 120 (FREEMAIN) VIA CONDITIONAL REGISTER FORM OF 00207002 * FREEMAIN MACRO 00207802 * 00208602 *02* CONTROL-BLOCKS = CVT AND GDA (REFERENCE ONLY) AND CPAB 00209402 * (REFERENCED AND DELETED) 00210202 * 00211002 *01* TABLES = NONE 00211802 *01* MACROS = FREEMAIN 00212602 * 00213402 *02* SERIALIZATION = THE 'CPABFLGW' FIELD IS USED TO SERIALIZE ALL 00213802 * OPERATIONS ON ANY SINGLE POOL EXTENT, REGARDLESS OF THE TYPE 00214202 * OF OPERATION. THIS FIELD IS MANIPULATED WITH THE 'CS' (COMPARE 00214602 * AND SWAP) INSTRUCTION. ONE BIT IN THIS FIELD, 'DELETELK', IS 00214702 * USED TO INDICATE THAT THE EXTENT IS BEING DELETED FROM THE 00214802 * POOL. IF A DELETE IS OCCURING (THE BIT IS 'ON'), ALL OTHER 00214902 * OPERATIONS ARE PROHIBITED ON THE EXTENT BEING DELETED. IF NO 00217502 * DELETE IS OCCURRING, THE USE COUNT 'CPABUSE#' IS USED TO 00219502 * PREVENT A DELETE FROM STARTING IN THE MIDDLE OF SOME OTHER 00221502 * PROCESS. A NON-ZERO VALUE FOR 'CPABUSE#' WILL PREVENT AN 00221902 * EXTENT FROM BEING DELETED. ONCE THE EXTENT HAS BEEN LOCKED 00222302 * AGAINST DELETES, THE DOUBLE-WORD FIELD CONSISTING OF 00222702 * 'CPABDEQC' AND 'CPABFACP' IS USED TO SERIALIZE THE ACQUISITION 00222802 * AND RELEASE OF CELLS IN THE SINGLE EXTENT. THIS DOUBLE-WORD 00222902 * FIELD IS MANIPULATED WITH THE 'CDS' (COMPARE DOUBLE AND SWAP) 00223002 * INSTRUCTION. 00223702 * 00224102 * 00225402 *01* CHANGE-ACTIVITY = NONE ... NEW FOR OS/VS2 RELEASE 2 00226102 *01* MESSAGES = NONE 00228302 *01* ABEND-CODES = NONE 00230902 * 00233502 **** END OF SPECIFICATIONS ***/ 00236102 EJECT 00282402 */*DELCPOOL: CHART (AMODE) */ 00295002 */* HEADER 00305002 */*DYNAMIC QUICKCELL FUNCTION 00305402 */* DELETE CELL POOL ROUTINE 00305802 */* 00305902 */* PAGE # */ 00309602 */*IEAVDELP: E (,%D1) BRANCH ENTRY */ 00313302 */*%D1: D (YES,%PERM,NO,%DYN) PERMANENT CPID? */ 00317002 */*%PERM: P (,%D2) CALCULATE CPAB ADDRESS IN CPAB TABLE.*/ 00328002 */*%DYN: D (YES,%RC16,NO,%DYN2) NULL CPID? (=0) */ 00339002 */*%DYN2: P (,%D2) CALCULATE CPAB ADDRESS */ 00350002 */*%D2: D (NO,%RC16,YES,%D3) CPID MATCH ONE IN CPAB? */ 00400002 */*%D3: D (NO,%RC12,YES,%D4) IS THE POOL FORMATTED? */ 00450002 */*%D4: D (YES,%EXT,NO,%NIP) 'EXTENT' DELETION REQUEST ? */ 00500002 */*%NIP: D (YES,%RC8,NO,EXTENT) NIP BUILT THIS POOL? */ 00510002 */*%EXT: D (YES,EXTENT,NO,%RC12) DOES THE POOL HAVE EXTENTS? */ 00550002 */*EXTENT: M (,%D2A) FIND LAST EXTENT */ 00700002 */*%D2A: D (ON,%RC20,OFF,%DEL) TEST AND SET DELETE INHIBIT 00710002 */*FLAG*/ 00720002 */*%DEL: P (,%FRD) DEQUEUE THIS EXTENT */ 00750002 */*%FRD: D (YES,%FREE,NO,%DST1) FREEMAIN REQUEST? */ 00800002 */*%DST1: P (,%DEL3) STORE SUBPOOL AND POOL LENGTH IN POOL AREA 00810002 */* */ 00820002 */*%FREE: S (,%DEL2) FREEMAIN: FREE THIS EXTENT & CPAB(E)*/ 00850002 */*%DEL2: D (NO,%DST2,YES,%DEL3) FREEMAIN SUCCESSFUL? */ 00900002 */*%DEL3: D (NO,%DCD,YES,%RC0) IS THE POOL FULLY DELETED? */ 01000002 */*%DCD: D (YES,%RC0,NO,%DCO) DELETE 'EXTENT=LAST' REQUEST? */ 01150002 */*%DCO: D (NO,%D2A,YES,%DEC) IS THIS ORIGINAL CPAB? */ 01200002 */*%DEC: D (YES,%SYS,NO,%RC0) DELETE POOL REQUEST? */ 01210002 */*%SYS: D (YES,%ZCPAB,NO,%D2A) SYSTEM POOL? */ 01300002 */*%ZCPAB: P (,%FRD) ZERO OUT CPAB FIELDS (EXCEPT CPID) AFTER 01350002 */*SAVING ADDRESS AND SIZE*/ 01360002 */*%DST2: P (,%RC4) STORE SUBPOOL AND POOL LENGTH IN POOL AREA 01360402 */**/ 01360802 */*%RC4: R RC=4, R0= FREEMAIN RETURN CODE */ 01362002 */*%RC8: R RC=8 */ 01364002 */*%RC12: R RC=12 */ 01366002 */*%RC20: R RC=20 */ 01368002 */*%RC16: R RC=16 */ 01370002 */*%RC0: R RC=0 -- NORMAL-- */ 01380002 */*IEAVDELP: END */ 01400002 EJECT 01450002 IEAVDELP CSECT 01860002 R0 EQU 0 ENTRY PARAMETER, CONTAINS CPID 01900002 * IMMEDIATELY BECOMES SCRATCH. 01910002 R1 EQU 1 ENTRY PARAMETER, CONTAINS OPTION CODE 01950002 * IMMEDIATELY BECOMES SCRATCH. 01960002 R2 EQU 2 SCRATCH 02000002 R3 EQU 3 ON ENTRY, CONTAINS CVT ADDRESS 02050002 * SCRATCH, FOLLOWING 'GOTCPAB' 02060002 R4 EQU 4 ORIGINAL CPAB BASE POINTER 02100002 R5 EQU 5 SCRATCH 02150002 R6 EQU 6 SCRATCH 02200002 R7 EQU 7 PRESERVED RETURN POINT TO USER 02250002 R8 EQU 8 INTERNAL LINKAGE REGISTER 02300002 R9 EQU 9 USED TO SAVE ENTRY PARAMETER (CPID) 02350002 R10 EQU 10 USED TO SAVE ENTRY PARAMETER (OPTIONS) 02400002 R11 EQU 11 HEAD POINTER FOR THE PUSH-DOWN STACK OF 02450002 * DEQUEUED EXTENTS WHEN FREEMAIN IS 02460002 * SUPPRESSED. 02470002 R12 EQU 12 PROGRAM BASE REGISTER 02500002 R13 EQU 13 CONTAINS ADDRESS OF CALLER'S SAVE AREA 02550002 R14 EQU 14 CONTAINS ADDRESS OF RETURN POINT 02600002 * IMMEDIATELY BECOMES SCRATCH. 02610002 R15 EQU 15 USED FOR RETURN CODE ON EXIT 02650002 * IMMEDIATELY BECOMES SCRATCH. 02660002 LOWHALF EQU 3 MASK USED FOR CLM OF LOW ORDER HALF-WORD 02670002 USING IEAVDELP,R15 02680002 MODID BR=YES 02690002 DROP R15 02692002 BALR R12,0 02700002 USING *,R12 02750002 *********************************************************************** 02760002 * SINCE THE PROGRAM HAS NO PLACE TO SAFELY STORE, THE ENTRY 02800002 * PARAMETERS (CPID AND OPTION CODE) ARE PRESERVED IN REGISTERS, 02850002 * BECAUSE THEY ARE REQUIRED THROUGHOUT THE PROGRAM. 02900002 *********************************************************************** 02902002 LR R7,R14 SAVE RETURN ADDRESS TO CALLER 02910002 LR R10,R1 SAVE OPTION CODE 02950002 LR R9,R0 SAVE CPID 03000002 SR R11,R11 CLEAR PUSH-DOWN LIST ADDRESS 03050002 LTR R4,R0 TEST CPID VALUE AND SET CPAB BASE 03100002 BM PERMCPID NEGATIVE, PERMANENT CPID 03150002 BZ DELERR16 NULL (=0), ERROR RETURN. 03200002 EJECT 03250002 *********************************************************************** 03260002 * THE CPID IS FOR A DYNAMIC POOL, AND THE CPAB ADDRESS IS FOUND 03300002 * BY MULTIPLYING THE CPID BY 4. 03350002 *********************************************************************** 03360002 SLL R4,2 MULTIPLY CPID BY 4 TO GET CPAB 03400002 B GOTCPAB ADDRESS AND CONTINUE PROCESSING 03450002 SPACE 2 03500002 *********************************************************************** 03510002 * THE CPID IS FOR A PERMANENT (SYSTEM) POOL, THE CPAB IS 03550002 * FOUND BY USING THE LOW-ORDER BYTE OF THE CPID AS AN 03600002 * INDEX INTO THE TABLE OF PERMANENT CPABS. THE TABLE IS 03650002 * LOCATED VIA THE GLOBAL DATA AREA (GDA), WHICH IS FOUND 03700002 * FROM THE CVT. 03750002 *********************************************************************** 03760002 PERMCPID EQU * 03800002 USING CVT,R3 03850002 L R3,CVTGDA GLOBAL DATA AREA ADDRESS 03900002 USING GDA,R3 03950002 ***** NOTE: THIS CALCULATION IS DEPENDENT UPON THE LENGTH OF 03952002 ***** THE CPAB REMAINING AT 32 BYTES. 03956002 N R4,F255 ISOLATE LOW-ORDER BYTE OF CPID 03960002 SLL R4,5 MULTIPLY BY CPAB LENGTH (32 BYTES) 03970002 A R4,PFSTCPAB + PERMANENT CPAB TABLE ADDRESS 04000002 * RESULTING IN THE CPAB ADDRESS IN REG 4. 04050002 SPACE 3 04100002 *********************************************************************** 04110002 * *** COMMON PATH *** CHECK FOR MATCHING CPID IN THE CPAB 04150002 * BEFORE CONTINUING WITH THE DELETION PROCESS. 04200002 *********************************************************************** 04210002 GOTCPAB EQU * 04250002 USING CPAB,R4 04300002 C R9,CPABCPID VALIDATE THE CPID FOR POOL INTEGRITY 04350002 BNE DELERR16 NO MATCH, ERROR RETURN. 04400002 SPACE 2 04410002 *********************************************************************** 04420002 * THIS IS THE CORRECT POOL, NOW CHECK TO SEE IF IT WAS 04450002 * BUILT BY SYSTEM INITIALIZATION AND THAT THIS IS NOT 04500002 * AN ATTEMPT TO DELETE THE ENTIRE POOL. THIS WILL PREVENT 04550002 * ANY POOL WHICH MUST REMAIN AROUND UNTIL SYSTEM SHUT-DOWN 04600002 * FROM BEING INADVERTENTLY DELETED. 04650002 *********************************************************************** 04660002 C R10,POOLDEL# IS THIS AN EXTENT DELETION REQUEST? 04700002 BL NONIPTST YES, SKIP THE 'NIP' BUILT TEST 04750002 TM CPABFLGS,NIPBLDCP IF IT WAS BUILT AT SYSTEM 04800002 BO DELERR08 INITIALIZATION, ERROR RETURN 04950002 B EXTENT OTHERWISE CONTINUE 05010002 NONIPTST EQU * 05050002 CLC CPABNXTP,F0 IS THERE A FIRST EXTENT ? 05100002 BE DELERR12 NO, ERROR RETURN 05200002 EJECT 05250002 *********************************************************************** 05260002 * FIND THE LAST EXTENT ON THE QUEUE AND PREPARE TO DELETE IT. 05300002 *********************************************************************** 05310002 EXTENT EQU * 05350002 SR R6,R6 INITIALIZE PRIOR CPAB POINTER 05360002 EXTENT0 EQU * 05370002 CLC CPABNXTP,F0 IS THIS THE LAST EXTENT? 05400002 BE LASTEXT YES, GO DEQUEUE IT. 05450002 LR R6,R4 NO, STEP FORWARD DOWN THE QUEUE 05500002 L R4,CPABNXTP AND GET THE NEXT CPAB ADDRESS. 05550002 B EXTENT0 SCAN UNTIL LAST EXTENT IS LOCATED 05600002 SPACE 2 05650002 *********************************************************************** 05660002 * THIS IS THE LAST EXTENT, TEST IT FOR MUTUALLY 05700002 * EXCLUSIVE OPERATIONS, TO PREVENT POOL DESTRUCTION. 05750002 *********************************************************************** 05760002 LASTEXT EQU * 05800002 L R0,CPABFLGW GET LOCKING DATA 05850002 CLM R0,LOWHALF,F0 TEST FOR MUTUALLY EXCLUSIVE OPERATIONS 05900002 BNE DELERR20 ONE IN PROCESS, ERROR EXIT 05950002 LR R1,R0 NONE, SET DELETE LOCK 06000002 O R1,DELETEON ON IN A COPY OF LOCKING DATA 06050002 CR R0,R1 IF THE DELETE BIT WAS ON, A DELETE 06060002 BE DELERR20 WAS ALREADY IN PROCESS, ERROR. 06070002 CS R0,R1,CPABFLGW OTHERWISE, TRY TO SET THE LOCK. 06100002 BNE DELERR20 THE LOCK DATA HAS CHANGED, ERROR 06150002 SPACE 2 06160002 *********************************************************************** 06170002 * IF THE STORE WAS SUCCESSFUL, NO OTHER FUNCTION WILL 06200002 * ATTEMPT TO USE THIS EXTENT, SO THE DELETION CAN 06250002 * PROCEED SAFELY. 06300002 *********************************************************************** 06302002 LTR R6,R6 IS THIS THE ORIGINAL EXTENT? 06310002 BNZ DEQUEUE NO, DEQUEUE IT. 06320002 C R10,POOLDEL# YES, IS THIS A POOL DELETE? 06330002 BL UNLOCKIT NO, RELEASE (UNLOCK) THIS EXTENT. 06340002 LR R3,R4 SAVE THE ADDRESS OF THE ORIGINAL EXTENT 06340102 B REMOVEAB AND SKIP THE DEQUEUEING MVC 06340402 DEQUEUE EQU * 06342002 MVC CPABNXTP-CPAB(L'CPABNXTP,R6),CPABNXTP DEQUEUE THE CPAB 06350002 EJECT 07550002 *********************************************************************** 07560002 * THIS ROUTINE REMOVES THE CPAB WHOSE ADDRESS IS IN REGISTER 4. 07600002 * IF THE SUPPRESS FREEMAIN OPTION WAS GIVEN, THE ROUTINE STORES 07650002 * THE FREEMAIN INFORMATION IN THE FIRST TWO WORDS OF THE EXTENT. 07700002 * IF FREEMAIN IS ALLOWED, THE ROUTINE ISSUES THE FREEMAIN TO 07750002 * DELETE THE EXTENT AND ITS CPAB. 07800002 *********************************************************************** 07810002 REMOVEAB EQU * 07850002 L R2,CPABENAD END OF EXTENT ADDRESS 07900002 L R6,CPABSTAD STARTING ADDRESS OF EXTENT 07910002 SR R2,R6 EXTENT LENGTH = END ADDR - START ADDR 07950002 BNP DELERR12 ERROR, UNFORMATTED POOL (LENGTH <= 0) 08000002 TM CPABFLGS,CPABEXTN IS THIS AN EXTENT 08050002 BO BUMPSIZE YES, ADD CPAB LENGTH TO EXTENT SIZE 08100002 LTR R9,R9 NO, IS IT A DYNAMIC POOL? 08150002 BM NOBUMPSZ NO, DO NOT ADD CPAB SIZE 08200002 BUMPSIZE EQU * 08400002 LA R15,CPABNXTP-CPAB+L'CPABNXTP CPAB LENGTH 08450002 SR R6,R15 TRUE START ADDRESS (CPAB ADDRESS) 08550002 AR R2,R15 TRUE LENGTH (INCLUDES CPAB LENGTH) 08600002 NOBUMPSZ EQU * 08650002 SR R5,R5 CLEAR REGISTER FOR SUBPOOL NUMBER 08652002 IC R5,CPABSPID SUBPOOL NUMBER FOR FREEMAIN 08654002 L R4,CPABCPID LOAD POINTER TO ORIGINAL CPAB 08660002 * OR CPID OF THE POOL, IF ORIGINAL BEING FREED. 08670002 LR R15,R10 COPY THE OPTION CODE AND TEST 08720002 N R15,FRMBIT31 IT FOR THE OCCURRENCE OF THE 08770002 CLR R15,R10 OCCURRENCE OF THE FREEMAIN SUPRESS BIT 08820002 BNE NOFREEMN IF ON, SKIP FREEMAIN 08850002 FREEMAIN RC,A=(R6),LV=(R2),SP=(R5) 08900002 LTR R15,R15 FREEMAIN SUCCESSFUL? 08950002 BZ REMOVED YES, PREPARE TO RETURN, IF FINISHED 09050002 EJECT 09100002 *********************************************************************** 09110002 * THIS ROUTINE SAVES THE NECESSARY DATA FOR FREEMAINING 09150002 * THE EXTENT THAT WAS NOT SUCCESSFULLY FREEMAINED IN CASE 09200002 * THE CALLER HAS ANY BETTER CHANCE OF RECOVERING THE 09250002 * ERROR THAN THIS PROGRAM DOES. 09300002 *********************************************************************** 09310002 DELERR04 EQU * 09350002 LR R1,R6 PUSH DOWN PRIOR FREED EXTENT 09400002 LR R0,R15 TRANSFER FREEMAIN ERROR CODE 09450002 LA R15,4 SET UP ERROR CODE FOR FREEMAIN FAILURE 09500002 USING ERRLIST,R6 09550002 ST R11,ELISTCHN STORE PRIOR FREED POOL ADDRESS 09560002 ST R2,ELISTLEN STORE LENGTH OF THE AREA 09570002 STC R5,ELISTSP# STORE SUBPOOL NUMBER OF AREA 09580002 LR R11,R6 PUSH DOWN PRIOR FREED AREA (IF ANY) 09590002 LR R14,R7 RESTORE CALLER'S RETURN ADDRESS 09592002 BR R14 RETURN TO CALLER 09594002 SPACE 2 09600002 *********************************************************************** 09610002 * THIS ROUTINE SAVES THE DATA FOR FREEMAIN SO THAT THE 09650002 * USER CAN ISSUE HIS OWN WHEN HE HAS SUPPRESSED FREEMAIN 09700002 * BY DELCPOOL. 09750002 *********************************************************************** 09760002 NOFREEMN EQU * 09800002 ST R11,ELISTCHN STORE PRIOR FREED POOL ADDRESS 09900002 ST R2,ELISTLEN STORE LENGTH OF THE AREA 09950002 STC R5,ELISTSP# STORE SUBPOOL NUMBER OF AREA 10000002 LR R11,R6 PUSH DOWN PRIOR FREED AREA (IF ANY) 10050002 SPACE 2 10150002 *********************************************************************** 10170002 * ON RETURN, REG.4 CONTAINS THE CONTENTS OF 'CPABCPID' FROM THE 10180002 * CPAB FOR THE EXTENT JUST DELETED. IF THIS WAS THE ORIGINAL 10190002 * CPAB, THEN REG 4 = THE CPID, OTHERWISE, IT IS THE ADDRESS OF 10192002 * THE ORIGINAL CPAB, AND CAN BE USED FOR THE QUEUE SEARCH. 10194002 * NOW THAT THE LAST EXTENT OF THOSE THAT REMAIN HAS BEEN 10196002 * REMOVED, CHECK TO SEE IF THE REQUEST WAS ONLY FOR THE 10198002 * DELETION OF THE LAST EXTENT. IF IT WAS, RETURN. 10198402 *********************************************************************** 10198502 REMOVED EQU * 10198602 C R10,LASTLIM# WAS THIS EXTENT=LAST? 10198802 BNH DELEXIT0 YES, SUCCESSFUL OPERATION, EXIT 10199202 CR R4,R9 NO, IS THE WHOLE POOL GONE? 10199602 BE DELEXIT YES, RETURN TO USER 10199702 B EXTENT NO, GO FIND NEXT EXTENT TO BE DELETED 10199802 EJECT 10199902 *********************************************************************** 10210002 * RETURN TO THE USER WITH R1 POINTING TO THE DELETED EXTENT 10216602 * QUEUE, IF ANY, AND R0 CONTAINING THE CPID. 10226602 * IF THIS WAS THE DELETION OF A SYSTEM POOL, THEN THE CPAB 10230602 * FIELDS (EXCEPT THE ID 'CPABCPID') ARE TO BE ZEROED. REG. 3 10232602 * CONTAINS THE ORIGINAL CPAB ADDRESS. 10233002 *********************************************************************** 10233102 DELEXIT EQU * 10233902 LTR R9,R9 WAS THIS A PERMANENT POOL? 10236402 BNM DELEXIT0 NO, SKIP THE CPAB ZEROING PROCESS 10237202 DROP R4 10238802 USING CPAB,R3 10240802 MVI CPABCSZE,0 YES, ZERO OUT THE CPAB FIELDS 10242802 MVC CPABCSZE+1(CPABNXTP-CPABCSZE+L'CPABNXTP-1),CPABCSZE 10243202 DROP R3 10243602 USING CPAB,R4 10244002 DELEXIT0 EQU * 10244102 LR R1,R11 ADDRESS OF PUSH-DOWN STACK (IF ANY) 10244202 LR R0,R9 CPID OF THIS POOL 10244402 LR R14,R7 RESTORE THE RETURN ADDRESS. 10258202 SR R15,R15 RETURN CODE OF ZERO 10268202 BR R14 RETURN TO CALLER 10270202 SPACE 2 10270302 *********************************************************************** 10270402 * THE ORIGINAL CPAB HAS BEEN LOCKED, BUT IS NOT TO BE 10271102 * DELETED, UNLOCK IT BEFORE RETURNING. 10273102 *********************************************************************** 10275502 UNLOCKIT EQU * 10275902 L R0,CPABFLGW GET THE LOCK FOR THE EXTENT 10276002 LR R1,R0 COPY IT AND TURN OFF THE 10276102 N R1,DELETOFF DELETE LOCK BIT 10276302 CS R0,R1,CPABFLGW STORE THE LOCK (SHOULD GO THE FIRST TIME) 10276402 BE DELEXIT0 EXIT WHEN LOCK HAS BEEN TURNED OFF. 10276502 B UNLOCKIT LOOP IF NECESSARY TO TURN IT OFF. 10276602 EJECT 10276702 *********************************************************************** 10276902 * AN ATTEMPT HAS BEEN MADE TO DELETE A POOL CREATED BY 10277602 * SYSTEM INITIALIZATION. THE ASSUMPTION IS MADE THAT SUCH 10278302 * POOLS MUST REMAIN UNTIL THE SYSTEM ITSELF TERMINATES, 10279002 * THEREFORE, DELETION OF SUCH POOLS IS NOT ALLOWED. 10279702 *********************************************************************** 10280402 DELERR08 EQU * 10281102 LA R15,8 SET RETURN CODE = 8 10281802 BR R7 RETURN TO CALLER 10282502 SPACE 2 10283202 *********************************************************************** 10283902 * THE EXTENT TO BE DELETED IS UNFORMATTED, SO NO ATTEMPT 10284602 * CAN BE MADE TO DELETE IT, AS ITS LENGTH CANNOT BE 10285302 * COMPUTED PROPERLY. THIS OCCURS WHEN THE START ADDRESS 10286002 * OF THE EXTENT 'CPABSTAD' IS LESS THAN OR EQUAL TO THE 10286702 * END ADDRESS 'CPABENAD'. THE STORAGE IS LEFT UNCHANGED, 10287402 * AND IT IS THE USER'S RESPONSIBILITY TO FREE THE EXTENT. 10288102 * THIS RETURN CODE IS ALSO RETURNED WHEN A REQUEST 10288502 * TO DELETE AN EXTENT OR EXTENTS WAS MADE, AND ONLY 10288602 * THE ORIGINAL POOL SEGMENT EXISTS. 10288702 *********************************************************************** 10288802 DELERR12 EQU * 10289502 LA R15,12 SET RETURN CODE = 12 10290202 BR R7 RETURN TO CALLER 10290902 SPACE 2 10291602 *********************************************************************** 10292302 * THE CPID PASSED IS EITHER NULL (=0) OR DOES NOT AGREE 10293002 * WITH THE CPID IN THE CPAB REFERENCED BY THE ID PASSED. 10293702 *********************************************************************** 10294402 DELERR16 EQU * 10295102 LA R15,16 SET RETURN CODE = 16 10296502 BR R7 RETURN TO CALLER 10298502 SPACE 2 10299002 *********************************************************************** 10299102 * THE EXTENT BEING DELETED WAS FOUND TO BE THE OBJECT OF A 10299402 * CONCURRENT OPERATION WHICH INHIBITS THE DELETE FUNCTION. 10299802 * IN THIS CASE, A RETURN CODE OF 20 IS GENERATED AND RETURN 10300002 * IS MADE TO THE CALLER. THE EXTENT IS LEFT ON THE QUEUE. 10308202 *********************************************************************** 10310102 DELERR20 EQU * 10310202 LA R15,20 SET RETURN CODE = 20 10312202 BR R7 RETURN TO CALLER 10314202 EJECT 10314602 *********************************************************************** 10316202 * CONSTANTS AND DATA AREAS USED BY THE PROGRAM 10316802 *********************************************************************** 10318802 POOLDEL# DC F'8' OPTION CODE FOR POOLDELETE 10325102 F0 DC F'0' 10333402 F255 DC F'255' MASK FOR MODULO DIVIDE BY 256 10341702 * THE FOLLOWING TWO MASKS ARE USED TO TURN THE DELETE LOCK BIT 10343702 * ON/OFF WHILE THE FLAG WORD IS IN A REGISTER. 10345702 DELETEON DC AL2(DELETELK),AL2(0) 10350002 DELETOFF DC X'FF',AL1(X'FF'-DELETELK),2X'FF' 10360002 LASTLIM# DC F'3' OPTION CODE FOR LAST EXTENT DELETION 10400002 FRMBIT31 DC F'-2' MASK TO TEST FOR FREEMAIN SUPRESSION 10450002 SPACE 3 10610002 *********************************************************************** 10612002 * THIS DSECT DESCRIBES THE TWO-WORD ERROR LIST SET UP 10620002 * IN THE FIRST TWO WORDS OF THE UN-FREEMAINED EXTENT. 10630002 *********************************************************************** 10640002 ERRLIST DSECT 10650002 ELISTLEN DS 0F 10660002 ELISTSP# DS C SUBPOOL NUMBER 10700002 DS AL3 LENGTH 10750002 ELISTCHN DS A CHAINING ADDRESS TO NEXT LIST 10800002 EJECT 10850002 CVT DSECT 10900002 CVT LIST=NO 10950002 EJECT 10960002 IHAGDA 11000002 EJECT 11010002 IHACPAB 11050002 END 11100002