Type ASSEMBLE
Source Lines : 1,519
Fixes Applied : 3
Most Recent Version : Tuesday, December 12, 1978
Last Fix ID : [HRC012DS]
Module
DMSBWR (WRBUF)
Function
TO WRITE ONE OR MORE SUCCESSIVE ITEMS INTO A SPECIFIED DISK FILE.
Attributes
NUCLEUS RESIDENT, REENTRANT, CALLED BY BALR OR SVC
Operation
WRBUF FIRST PERFORMS A SERIES OF TESTS TO ENSURE THAT THE PARAMETER LIST IS LEGAL. IF IT IS NOT, WRBUF SIGNALS THE ERROR AND RETURNS TO THE CALLING PROGRAM. IF THE PARAMETER IS LEGAL, WRBUF CALLS THE ACTLKP ROUTINE TO SEE IF THE FILE EXISTS AND IS ACTIVE; IF YES, PROCESSING PROCEEDS AS DESCRIBED UNDER "FILE ACTIVE". IF NOT, WRBUF CALLS THE FSTLKW FUNCTION PROGRAM TO DETERMINE WHETHER THE SPECIFIED FILE EXISTS. IF YES, PROCESSING PROCEEDS AS DESCRIBED UNDER "FILE EXISTS, NOT ACTIVE". IF NOT, PROCESSING PROCEEDS AS DESCRIBED UNDER "FILE DOES NOT EXIST". FILE DOES NOT EXIST: IF THE FILE DOES NOT EXIST, WRBUF CALLS ADTLKP TO DETERMINE THE ACTIVE DISK TABLE PERTAINING TO THE GIVEN MODE, AND CHECKS TO ENSURE THAT THE DISK IS AVAILABLE AND IN READ-WRITE STATUS (ERROR RETURN IF NOT). THEN ACTFREE IS CALLED TO OBTAIN AN AVAILABLE SLOT IN THE ACTIVE FILE TABLE FOR THE FILE ABOUT TO BE CREATED. THEN WRBUF INITIALIZES THE AFT ENTRY WITH NECESSARY INFORMATION INCLUDING THE NAME, TYPE, AND MODE OF THE FILE. WRBUF THEN CALLS THE QQTRK ROUTINE TO OBTAIN AN AVAILABLE SIXTEENTH OF A TRACK OF DISK SPACE FOR USE AS THE FIRST CHAIN LINK AND STORES THE DISK ADDRESS RETURNED BY QQTRK IN THE FILE STATUS TABLE. NEXT, WRBUF CALCULATES (FROM THE ITEM NUMBER SUPPLIED IN THE PARAMETER LIST) THE DATA BLOCK INTO WHICH THE ITEM(S) IS/ARE TO BE WRITTEN. THIS CALCULATION ALSO YIELDS THE LOCATION WITHIN THE DATA BLOCK AT WHICH THE ITEM(S) WILL RESIDE. (THE CALCULATION IS ((N-1)*L)/800. N IS THE ITEM NUMBER, L IS THE ITEM LENGTH, AND 800 IS THE LENGTH OF A DATA BLOCK. THE QUOTIENT PRODUCED BY THIS CALCULATION IS THE NUMBER OF THE AFFECTED DATA BLOCK AND THE REMAINDER IS THE DISPLACEMENT INTO THE DATA BLOCK AT WHICH THE ITEM(S) WILL RESIDE.) NEXT, WRBUF CALCULATES THE NUMBER OF BYTES TO BE WRITTEN. THIS IS EQUAL TO THE ITEM LENGTH MULTIPLIED BY THE NUMBER OF ITEMS TO BE WRITTEN. BOTH VALUES ARE OBTAINED FROM THE PARAMETER LIST. WRBUF THEN MARKS THE FILE ACTIVE, OBTAINS BUFFER SPACE FOR THE DATA BLOCK, AND DETERMINES IF THE ITEM TO BE WRITTEN IS OF FIXED OR VARIABLE LENGTH. IF OF VARIABLE LENGTH, PROCESSING PROCEEDS AS DESCRIBED UNDER "VARIABLE-LENGTH ITEM". IF OF FIXED LENGTH, PROCESSING PROCEEDS AS DESCRIBED BELOW. FIXED-LENGTH ITEM: WRBUF DETERMINES THE CHAIN LINK THAT SHOULD CONTAIN THE ADDRESS OF THE AFFECTED DATA BLOCK. (ORDINARILY, AT THIS POINT, THIS WILL BE THE FIRST CHAIN LINK AND IT WILL EXIST IN MAIN STORAGE.) IF THIS CHAIN LINK DOES NOT EXIST (THAT IS, ITS CORRESPONDING ENTRY IN THE FIRST CHAIN LINK IS NOT A VALID DISK ADDRESS), WRBUF CALLS THE TRKLKP FUNCTION PROGRAM TO OBTAIN A QUARTER OF A TRACK FOR THE NEW CHAIN LINK, INSERTS THE DISK ADDRESS RETURNED BY TRKLKP INTO THE CHAIN LINK DIRECTORY OF THE ACTIVE FILE TABLE ENTRY, AND OBTAINS STORAGE FOR USE IN CONSTRUCTING THE NEW CHAIN LINK. IF THE CHAIN LINK EXISTS, WRBUF CALLS THE RDTK FUNCTION PROGRAM TO READ IT INTO MAIN STORAGE. WRBUF THEN DETERMINES IF THE AFFECTED DATA BLOCK EXISTS. (IT WILL IF THE CORRESPONDING ENTRY IN THE CHAIN LINK THAT IS IN MAIN STORAGE CONTAINS A VALID DISK ADDRESS.) IF IT DOES NOT EXIST, WRBUF CALLS THE TRKLKP FUNCTION PROGRAM TO OBTAIN A QUARTER OF A TRACK FOR THE NEW DATA BLOCK, INSERTS THE DISK ADDRESS RETURNED BY TRKLKP INTO THE APPROPRIATE ENTRY IN THE CHAIN LINK THAT IS IN MAIN STORAGE, AND CLEARS THE DATA BLOCK BUFFER FOR USE IN CONSTRUCTING THE DATA BLOCK. IF THE DATA BLOCK EXISTS, WRBUF CALLS THE RDTK FUNCTION PROGRAM TO READ IT INTO THE DATA BLOCK BUFFER. WRBUF THEN CALCULATES THE NUMBER OF BYTES IN THE DATA BLOCK BUFFER THAT ARE AVAILABLE FOR USE. (THE NUMBER OF BYTES AVAILABLE IS EQUAL TO 800 MINUS THE PREVIOUSLY CALCULATED DISPLACEMENT.) NEXT, WRBUF DETERMINES WHETHER THE NUMBER OF BYTES TO BE WRITTEN IS GREATER THAN THE NUMBER OF BYTES AVAILABLE IN THE DATA BLOCK BUFFER. IF THE NUMBER OF BYTES TO BE WRITTEN IS NOT GREATER THAN THE NUMBER AVAILABLE, WRBUF MOVES THE BYTES TO BE WRITTEN FROM THE INPUT BUFFER TO THE BLOCK BUFFER AND RETURNS TO THE CALLING PROGRAM. (IN THIS CASE, THE DATA BLOCK IS NOT WRITTEN ONTO DISK BECAUSE IT IS NOT FULL.) IF THE NUMBER OF BYTES TO BE WRITTEN EXCEEDS THE NUMBER OF BYTES AVAILABLE, WRBUF MOVES SUFFICIENT BYTES INTO THE DATA BLOCK BUFFER TO FILL IT, AND WRITES THE COMPLETED DATA BLOCK ONTO DISK. WRBUF THEN DETERMINES IF THE CHAIN LINK THAT SHOULD CONTAIN THE ADDRESS OF THE DATA BLOCK THAT IS TO RECEIVE THE OVERFLOW FROM THE PREVIOUS DATA BLOCK IS IN MAIN STORAGE. IF IT IS NOT, WRBUF WRITES THE CURRENT CHAIN LINK (THAT IS, THE ONE IN MAIN STORAGE) ONTO DISK AND RETRIEVES THE CHAIN LINK CONTAINING THE ADDRESS OF THE DATA BLOCK THAT IS TO RECEIVE THE OVERFLOW. THIS CHAIN LINK MAY OR MAY NOT EXIST. IF THE CHAIN LINK DOES NOT EXIST, WRBUF ALLOCATES DISK SPACE FOR THE NEW CHAIN LINK IN THE PREVIOUSLY DESCRIBED MANNER AND DETERMINES IF THE DATA BLOCK THAT IS TO RECEIVE THE OVERFLOW EXISTS AS PREVIOUSLY DESCRIBED. IF THE CHAIN LINK EXISTS, WRBUF READS IT INTO MAIN STORAGE AND DETERMINES IF THE DATA BLOCK TO RECEIVE THE OVERFLOW EXISTS. WHEN THE DATA BLOCK THAT IS TO RECEIVE THE OVERFLOW IS IN MAIN STORAGE, (THAT IS, IN THE DATA BLOCK BUFFER) WRBUF CALCULATES THE NUMBER OF BYTES REMAINING TO BE WRITTEN. IF THIS IS NOT GREATER THAN THE NUMBER OF BYTES AVAILABLE IN THE DATA BLOCK BUFFER (ON OVERFLOW, ALL 800 BYTES OF THE DATA BLOCK BUFFER ARE AVAILABLE), WRBUF MOVES THE REMAINING BYTES FROM THE INPUT BUFFER TO THE DATA BLOCK BUFFER AND RETURNS TO THE CALLER. IF THE NUMBER OF BYTES REMAINING TO BE WRITTEN IS GREATER THAN THE NUMBER OF BYTES AVAILABLE IN THE DATA BLOCK BUFFER, WRBUF MOVES SUFFICIENT BYTES INTO THE DATA BLOCK BUFFER TO FILL IT, WRITES THE DATA BLOCK ONTO DISK, AND MOVES THE OVERFLOW INTO THE NEXT DATA BLOCK AS DESCRIBED. VARIABLE-LENGTH ITEM: WRBUF READS SUCCESSIVE DATA BLOCKS (STARTING WITH THE FIRST) INTO THE DATA BLOCK BUFFER UNTIL IT LOCATES THE ONE THAT CONTAINS THE ITEM IMMEDIATELY PRECEDING THE ONE THAT CORRESPONDS TO THE ITEM NUMBER SPECIFIED IN THE PARAMETER LIST. IT THEN LOCATES THE END OF THAT ITEM. (THIS MAY ENTAIL READING ADDITIONAL DATA BLOCKS, DEPENDING ON THE LENGTH OF THE ITEM.) WHEN IT LOCATES THE END OF THE ITEM, WRBUF MOVES THE LENGTH OF THE ITEM TO BE WRITTEN FROM THE INPUT BUFFER TO THE LOCATION IN THE DATA BLOCK BUFFER IMMEDIATELY AFTER THE END OF THE PREVIOUS ITEM. IT THEN MOVES THE ITEM TO BE WRITTEN FROM THE INPUT BUFFER TO THE DATA BLOCK BUFFER IN THE SAME MANNER AS FOR FIXED-LENGTH ITEMS. (IF OVERFLOW OCCURS, IT IS HANDLED IN THE SAME MANNER AS FOR FIXED-LENGTH ITEMS.) FILE EXISTS, NOT ACTIVE: IF THE FILE EXISTS BUT IS NOT ACTIVE, WRBUF CALCULATES THE DATA BLOCK INTO WHICH THE ITEM(S) IS TO BE WRITTEN. THIS CALCULATION ALSO YIELDS THE LOCATION WITHIN THE DATA BLOCK AT WHICH THE ITEM(S) WILL RESIDE. ACTFREE IS CALLED TO OBTAIN AN AVAILABLE SLOT IN THE ACTIVE FILE TABLE AND TO STORE THE FST ENTRY THEREIN. NEXT, WRBUF MARKS THE FILE AS ACTIVE, READS THE FIRST CHAIN LINK INTO MAIN STORAGE, AND MOVES THE FIRST 80 BYTES OF THE FIRST CHAIN LINK INTO THE CHAIN LINK DIRECTORY OF THE ACTIVE FILE TABLE ENTRY. WRBUF THEN DETERMINES IF THE ITEM(S) TO BE WRITTEN ARE OF FIXED OR VARIABLE LENGTH. FOR BOTH OF THESE ITEM TYPES, WRBUF PROCEEDS AS DESCRIBED UNDER THE CORRESPONDING HEADING IN "FILE DOES NOT EXIST" IN THIS SECTION. FILE ACTIVE: IF THE FILE IS ACTIVE, WRBUF CALCULATES THE DATA BLOCK INTO WHICH THE ITEM(S) IS/ARE TO BE WRITTEN. THIS CALCULATION ALSO YIELDS THE DISPLACEMENT INTO THE DATA BLOCK AT WHICH THE ITEM(S) WILL RESIDE. NEXT, WRBUF DETERMINES THE NATURE OF THE ITEM(S) TO BE WRITTEN. IF OF VARIABLE LENGTH, WRBUF PROCEEDS AS DESCRIBED UNDER "VARIABLE-LENGTH ITEM". IF OF FIXED LENGTH, IT PROCEEDS AS DESCRIBED BLOW. FIXED-LENGTH ITEM: WRBUF DETERMINES WHETHER THE AFFECTED DATA BLOCK IS IN MAIN STORAGE. IF IT IS, WRBUF PROCEEDS AS DESCRIBED UNDER "FILE DOES NOT EXIST", STARTING AT THE POINT WHERE THE NUMBER OF BYTES AVAILABLE IN THE DATA BLOCK BUFFER IS CALCULATED. IF THE AFFECTED DATA BLOCK IS NOT IN MAIN STORAGE, WRBUF PROCEEDS IN ESSENTIALLY THE SAME MANNER AS DESCRIBED UNDER "FILE DOES NOT EXIST", STARTING AT THE POINT WHERE THE DATA BLOCK IS WRITTEN ONTO DISK. (IN THIS CASE, AN OVERFLOW CONDITION IS NOT BEING PROCESSED; HOWEVER, THE LOGIC USED TO OBTAIN THE AFFECTED CHAIN LINK AND DATA BLOCK IS ESSENTIALLY THE SAME. ALSO, BECAUSE THIS IS NOT AN OVERFLOW CONDITION, WHEN THE AFFECTED DATA BLOCK IS RESIDENT IN THE DATA BLOCK BUFFER, THE NUMBER OF BYTES AVAILABLE IN THAT BUFFER IS EQUAL TO 800 MINUS THE CALCULATED DISPLACEMENT.) VARIABLE-LENGTH ITEM: IF THE VARIABLE-LENGTH ITEM TO BE WRITTEN IMMEDIATELY FOLLOWS THE ONE THAT WAS JUST PROCESSED, WRBUF MOVES THE ITEM LENGTH FROM THE INPUT BUFFER INTO THE DATA BLOCK BUFFER IMMEDIATELY AFTER THE END OF THE PREVIOUS ITEM. IT THEN MOVES THE ITEM TO BE WRITTEN FROM THE INPUT BUFFER INTO THE DATA BLOCK BUFFER IMMEDIATELY AFTER THE LENGTH. THIS IS DONE IN THE USUAL MANNER. (IF OVERFLOW OCCURS, IT IS HANDLED IN THE USUAL MANNER.) IF THE ITEM TO BE WRITTEN DOES NOT IMMEDIATELY FOLLOW THE ONE THAT WAS JUST PROCESSED, WRBUF PROCEEDS IN THE SAME MANNER AS DESCRIBED UNDER THE VARIABLE-LENGTH ITEM PORTION OF "FILE DOES NOT EXIST". NOTES: 1. WRBUF CAN ONLY WRITE A CERTAIN NUMBER OF LOGICAL RECORDS OR ITEMS, REGARDLESS OF HOW MUCH DISK SPACE MAY BE AVAILABLE, BECAUSE THE "NUMBER OF ITEMS" IS KEPT IN A HALFWORD IN THE 40-BYTE FST ENTRY FOR THAT FILE, AND IS LIMITED BY THE SIZE OF A NUMBER WHICH WILL FIT IN A (16-BIT) HALFWORD. TO AVOID RUNNING INTO THIS LIMITATION BEFORE IT IS TOO LATE TO CLOSE THE FILE SUCCESSFULLY, WRBUF CHECKS THAT THE ITEM-NUMBER (WHEN A WRBUF CALL HAS BEEN COMPLETED) WILL NOT EXCEED A GIVEN LIMIT. IF IT DOES, AN ERROR CODE 6 IS RETURNED, AND NO MORE DATA IS WRITTEN. THE FILE MAY, HOWEVER, AT THIS POINT BE SUCCESSFULLY CLOSED (VIA FINIS), AND CAN LATER BE READ BY RDBUF. AT PRESENT THIS LIMITING NUMBER OF RECORDS HAPPENS TO BE 65533. (65533 WOULD HAVE BEEN THE ABSOLUTE LIMITING FACTOR.) 2. IN CALLS TO QQTRK FOR OBTAINING THE FIRST CHAIN LINK FOR A NEW FILE, AND TO TRKLKP FOR OBTAINING EITHER A NEW NTH CHAIN LINK OR A DATA BLOCK, ERROR CODES ARE CHECKED FROM THESE FUNCTION PROGRAMS FOR THE FULL DISK CONDITION. IF ANY OF THESE SITUATIONS OCCUR, WRBUF CAREFULLY SETS OR RESETS ANY FLAGS OR CONDITIONS AS NEEDED, AND PRESENTS THE USER WITH THE NON-FATAL ERROR-CODE 13. THE FILE WHICH WAS BEING WRBUF'ED (UNLESS NULL) IS THEN AVAILABLE AND COMPLETE INSOFAR AS THE DATA BEING WRITTEN COULD FIT IN THE SPACE AVAILABLE. THE DIRECTORY IS NOT UPDATED UNLESS A KX IS IN EFFECT, THUS ALLOWING ANY DESIRED ERROR RECOVERY PROCEDURES TO BE INSTITUTED. 3. BECAUSE OF THE DESIGN OF THE FIRST CHAIN LINK IN THE CMS FILE SYSTEM, THERE IS A LIMITATION OF 16060 800-BYTE DATA BLOCKS FOR ANY GIVEN FILE. IF A FILE BEING WRBUF'ED REACHES THIS LIMIT, AN ERROR 19 IS RETURNED, AND NO MORE DATA IS WRITTEN. THE FILE MAY BE CLOSED, AND CAN THEN BE SUCCESSFULLY READ (OR ERASED), BUT IT CANNOT BE MADE ANY LARGER. (A FILE OF THIS SIZE WOULD FILL MORE THAN HALF OF A FULL-SIZE 2314 DISK). 4. THERE IS ALSO A LIMIT OF 3400 FILES THAT CAN BE REPRESENTED FOR ANY GIVEN DISK, AS LIMITED BY THE LAYOUT OF THE MFD BLOCK. IF A DISK ALREADY HAS REACHED THIS MAXIMUM AND AN ATTEMPT TO WRBUF A NEW FILE IS MADE, WRBUF RETURNS AN ERROR CODE 10, AND THE NEW FILE IS NOT OPENED.
Calls to Other Routines
ACTFREE, ACTFRET, ACTLKP, ADTLKP, DISKDIE, FREE, FRET, FSTLKW, KILLEXF, QQTRK, QQTRKX, RDTK, TRKLKP, TRKLKPX, WRTK