<> <> <> <> <> <> DIRECTORY DBCommon, DBEnvironment; DBStorageVec: CEDAR DEFINITIONS IMPORTS DBEnvironment = BEGIN <> <> <> <> MaxWordsPerPage: CARDINAL = 512; RestOfWord: CARDINAL = 128; LengthField: TYPE = CARDINAL [0..MaxWordsPerPage); SlotIndexField: TYPE = CARDINAL [0..RestOfWord); SlotTypeField: TYPE = CARDINAL [0..RestOfWord); <> <> <> VecPage: TYPE = PRIVATE MACHINE DEPENDENT RECORD[ tag: CARDINAL [0..377B], <> unused: CARDINAL [0..1] _ NULL, highSlot: SlotIndexField, <> nFreeSlots: SlotIndexField, <> nWordsInFreeVecs: LengthField <> ];--VecPage <
> <> Slot: TYPE = PRIVATE MACHINE DEPENDENT RECORD[ type: SlotTypeField, <<"Type" of object stored in vec.>> vecOffset: LengthField <> ];--Slot <> <> FreeType: SlotTypeField = 0; <> UnFreeType: SlotTypeField = 177B; <> <> VecHeader: TYPE = PRIVATE MACHINE DEPENDENT RECORD[ slotIndex: SlotIndexField, <> length: PUBLIC LengthField <> ];--VecHeader <> <> <> InitializeVecPage: PROC[p: LONG POINTER TO VecPage, pageTag: CARDINAL]; <> <> TagOfPage: PROC[p: LONG POINTER TO VecPage] RETURNS[--pageTag-- CARDINAL] = TRUSTED INLINE BEGIN <> <> RETURN[p.tag]; END;--TagOfPage AllocVec: PROC[p: LONG POINTER TO VecPage, nWords: CARDINAL] RETURNS[--slotIndex-- CARDINAL, --success-- BOOLEAN]; <> <> <> WordsInLargestAllocableVec: PROC[p: LONG POINTER TO VecPage] RETURNS[--nWords-- CARDINAL]; <> FreeVec: PROC[p: LONG POINTER TO VecPage, slotIndex: CARDINAL]; <> ModifyVec: PROC[ p: LONG POINTER TO VecPage, slotIndex: CARDINAL, deltaWords: INTEGER, preserveContents: BOOLEAN] RETURNS[--success-- BOOLEAN]; <> <0 and>> <> <> <> VecOfSlot: PROC[p: LONG POINTER TO VecPage, slotIndex: CARDINAL] RETURNS[LONG POINTER TO VecHeader] = TRUSTED INLINE BEGIN <> <> <> <> IF slotIndex=0 OR slotIndex>HighSlotIndexOfPage[p] THEN ERROR DBEnvironment.InternalError -- BadSlotIndex --; RETURN[LOOPHOLE[p + LOOPHOLE[p + (DBCommon.WordsPerPage - SIZE[Slot]) - slotIndex*SIZE[Slot], LONG POINTER TO Slot].vecOffset, LONG POINTER TO VecHeader]]; END;--VecOfSlot LengthOfVec: PROC[v: LONG POINTER TO VecHeader] RETURNS[CARDINAL] = TRUSTED INLINE BEGIN <> RETURN[v.length]; END;--LengthOfVec TypeOfSlot: PROC[p: LONG POINTER TO VecPage, slotIndex: CARDINAL] RETURNS[CARDINAL] = TRUSTED INLINE BEGIN <> IF slotIndex=0 OR slotIndex>HighSlotIndexOfPage[p] THEN ERROR DBEnvironment.InternalError -- BadSlotIndex --; RETURN[LOOPHOLE[p + (DBCommon.WordsPerPage - SIZE[Slot]) - slotIndex*SIZE[Slot], LONG POINTER TO Slot].type]; END;--TypeOfSlot SetTypeOfSlot: PROC[ p: LONG POINTER TO VecPage, slotIndex: CARDINAL, newType: CARDINAL] = TRUSTED INLINE BEGIN <> IF slotIndex=0 OR slotIndex>HighSlotIndexOfPage[p] THEN ERROR DBEnvironment.InternalError -- BadSlotIndex --; LOOPHOLE[p + (DBCommon.WordsPerPage - SIZE[Slot]) - slotIndex*SIZE[Slot], LONG POINTER TO Slot].type _ newType; END;--SetTypeOfSlot WordsLeftOnPage: PROC[p: LONG POINTER TO VecPage] RETURNS[CARDINAL] = TRUSTED INLINE BEGIN <> <> <> <> RETURN[p.nWordsInFreeVecs - SIZE[VecHeader]]; END;--WordsLeftOnPage HighSlotIndexOfPage: PROC[p: LONG POINTER TO VecPage] RETURNS[CARDINAL] = TRUSTED INLINE BEGIN <> <> <> RETURN[p.highSlot]; END;--HighSlotIndexOfPage CheckVecPage: PROC[p: LONG POINTER TO VecPage, pageTag: CARDINAL]; <> <> IndexToSlot: PRIVATE PROC[p: LONG POINTER TO VecPage, slotIndex: CARDINAL] RETURNS[LONG POINTER TO Slot] = TRUSTED INLINE BEGIN RETURN[LOOPHOLE[p + (DBCommon.WordsPerPage - SIZE[Slot]) - slotIndex*SIZE[Slot], LONG POINTER TO Slot]]; END;--IndexToSlot IndexToOffset: PRIVATE PROC[slotIndex: CARDINAL] RETURNS[CARDINAL] = TRUSTED INLINE BEGIN RETURN[DBCommon.WordsPerPage - SIZE[Slot] - slotIndex*SIZE[Slot]]; END;--IndexToOffset END. -- DBStorageVec <> Created by MBrown on February 15, 1980 2:47 PM Changed by MBrown on February 15, 1980 10:31 PM <> Changed by MBrown on February 17, 1980 6:46 PM <> Changed by MBrown on February 17, 1980 8:22 PM < slot computation; added PRIVATE IndexToSlot to localize this>> <> Changed by MBrown on February 17, 1980 10:21 PM < HighSlotIndexOfPage. Added PRIVATE IndexToOffset>> <> Changed by MBrown on February 24, 1980 11:37 AM <> <> --to VecPage, and "LONG POINTER --TO Page--" to "LONG POINTER TO VecPage", to gain <> Changed by MBrown on February 24, 1980 1:01 PM <> <> <> Changed by MBrown on August 22, 1980 4:21 PM <> Changed by MBrown on September 26, 1980 11:21 AM <> <<>> Changed by Willie-Sue on February 15, 1985 <>