// B-Tree Maintenance Routines // Copyright Xerox Corporation 1979, 1981 // BTREE.DECL -- Structure definitions // last modified November 29, 1981 10:24 AM by Taft structure TS: // Tree State [ LogPageLength word // log2 of page length in words RootPage word // B-Page containing the root GreatestPage word // Greatest known B-page in the tree FirstFreePage word // Head of list of free B-pages le // GreatestPage, 0 if empty RecordCount word // Record count mod 2↑16 for checking ] manifest [ lTS = size TS/16 ] structure TREE: // Tree Descriptor [ BVRRP word // Address of a routine which reads a B-Tree page BVWRP word // Address of a routine which reads a B-Tree page // but sets its dirty bit on BLockCell word // Address of a routine which locks a // cell BUnlockCell word // Address of a routine which unlocks a // previously-locked cell BVAP word // Address of a routine which // allocates a new B-Tree page BVFP word // Address of a routine which accepts // back a previously-allocated B-Tree page BTBug word // Address of error-handling routine BTClose word // Address of routine to close this tree CompareKeyRtn word // Address of a routine which // compares the key in a // record with an isolated // key LengthRtn word // Address of a routine which // returns the length of a // record in words PageLength word // B-Page length in words (should be power of 2) Zone word // Pointer to a free storage zone object StateDirty word //true if state in core ne state on disk TS @TS // Permanent tree state = @TS vmd word // virtual memory descriptor (for IFS environment) ] manifest [ Empty = 0 maxRecordsPerPage = 1022/8 // assuming 8-word entries in 1024-word page maxLevelsInTree = 6 // maximum depth of tree ] structure BTE: // B-Tree Entry [ GrPtr word // Page containing sons greater // than this entry but less // than the next Record word 10 // The record corresponding to this // entry, containing a key ] structure ESLE: // Entry Sequence List Entry [ FwdP word EntSeqP word // Pointer to a sequence of entries EntSeqLen word // Length of sequence in words EntSeq word 10 // Sequence goes here ] structure ELE: // Entry List Element // Gives cumulative length and pointer to heap // entry. [ CumEntLen word HeapPos word ] structure ELL: // Block of Entry List Elements [ [ ELE↑0,3*maxRecordsPerPage + 2 @ELE ] = @ELE↑0,3*maxRecordsPerPage + 2 ] structure HP: // Heap of entries contending for father block [ HeapEnt↑1,256 word ] structure BTP: // B-Tree Page [ FreeWords word // Number of free words this page MinPtr word // Page containing smallest son of // this page BTEBlock word 1 // The BTE entries on this page ] manifest [ PageOverhead = offset BTP.BTEBlock/16 Rec0Offset = offset BTP.MinPtr/16 Rec1Offset = offset BTP.BTEBlock/16 ] structure PSE: // Path Stack Entry [ PageNo word // also appears as GrPtr field of BTE indexed // by LastOffset in previous stack level Offset word LastOffset word NextToLastOffset word ESLFront word // Added blocks of entries that go between // LastOffset and Offset ESLRear word LeastSon word ] // PathStk structure // Note that level 0 is dummy; it is used only when the root page splits // and a new root page must be created. structure PS: [ Tree word PathStkTop word PSE↑0,maxLevelsInTree : @PSE ] structure IS: // Insertion/deletion algorithm auxiliary state [ Tree word // Ptr to tree handle MaxFreeWords word // non-overhead words per page AwfullyFull word // words in 9/10 full page PrettyFull word // words in 2/3 full page FairlyFull word // words in 1/2 full page BreathingSpace word // words in 1/10 page PathStk word ELLPtr word // Ptr to vector of cumulative lengths of // ESL entries ELLLen word // Number of ESL entries HeapPtr word HeapSize word ] manifest [ // error codes, keying messages in Sys.errors ecRecGenReturnedWrongKey = 2100 ecMcCreightWasWrong = 2101 ecDepositESLWrong = 2102 ecEntryListTooShort = 2103 ecWritePageWrong = 2104 ecTwoBrothersNotEnough = 2105 ecNewRootOverflow = 2106 ecRecordCountsDisagree = 2107 ecRecordsOutOfOrder = 2108 ]