DIRECTORY Basics USING [charsPerWord, Comparison], PBasics USING [BITAND, BITXOR, bytesPerWord, Comparison, LongNumber, Move], Rope USING [ROPE], YggDID USING [], YggDIDPrivate USING [DIDRep, HighDIDSystemReserved, LowForIndexMaint, LowForNFSRoot, LowForRootDIDs], YggDIDMap USING [OpenDocumentFromDID], YggEnvironment USING [nullTransID], YggRep USING [TimeStamp]; YggDIDImpl: CEDAR PROGRAM IMPORTS Basics, PBasics, YggDIDMap EXPORTS YggDID, YggDIDPrivate, YggRep ~ BEGIN ROPE: TYPE ~ Rope.ROPE; DID: PUBLIC TYPE ~ REF DIDRep; DIDRep: PUBLIC TYPE ~ YggDIDPrivate.DIDRep; FirstDID: PUBLIC DID ; LastDID: PUBLIC DID ; DIDForRootDIDs: PUBLIC DID _ NEW[DIDRep _ [didHigh: YggDIDPrivate.HighDIDSystemReserved, didLow: YggDIDPrivate.LowForRootDIDs]]; DIDForIndexMaint: PUBLIC DID _ NEW[DIDRep _ [didHigh: YggDIDPrivate.HighDIDSystemReserved, didLow: YggDIDPrivate.LowForIndexMaint]]; DIDForNFSRoot: PUBLIC DID _ NEW[DIDRep _ [didHigh: YggDIDPrivate.HighDIDSystemReserved, didLow: YggDIDPrivate.LowForNFSRoot]]; AllNulls: PACKED ARRAY [0..Basics.charsPerWord) OF CHAR _ ALL[0C]; ValidateDID: PUBLIC PROC [did: DID] RETURNS [ok: BOOL _ TRUE] = { IF YggDIDMap.OpenDocumentFromDID[did: did, tid: YggEnvironment.nullTransID] = NIL THEN RETURN [FALSE]; }; CompareDIDs: PUBLIC PROC [did: DID, stableDID: LONG POINTER] RETURNS [Basics.Comparison] = { sDID: LONG POINTER TO DIDRep; IF did = NIL THEN ERROR; sDID _ LOOPHOLE[stableDID]; IF sDID = NIL THEN ERROR; TRUSTED { SELECT did.didHigh FROM > sDID.didHigh => RETURN [greater]; < sDID.didHigh => RETURN [less]; ENDCASE => SELECT did.didLow FROM > sDID.didLow => RETURN [greater]; < sDID.didLow => RETURN [less]; ENDCASE => RETURN [equal]; }; }; EqualDIDs: PUBLIC PROC [did1: DID, did2: DID] RETURNS [equal: BOOL] = { IF did1 = NIL AND did2 = NIL THEN RETURN [TRUE]; IF did1 = NIL OR did2 = NIL THEN RETURN [FALSE]; IF did1.didHigh = did2.didHigh AND did1.didLow = did2.didLow THEN RETURN [TRUE] ELSE RETURN [FALSE] }; SizeForDID: PUBLIC PROC [did: DID] RETURNS [bytes: INT] = { ddd: DIDRep; IF did = NIL THEN ERROR; ddd _ did^; bytes _ BYTES[DIDRep]; }; StabilizeDID: PUBLIC PROC [did: DID, buffer: LONG POINTER] = { IF did = NIL THEN ERROR; TRUSTED {PBasics.Move[dst: buffer, src: LOOPHOLE[did], nWords: BYTES[DIDRep]/PBasics.bytesPerWord];}; }; VolatilizeDID: PUBLIC PROC [buffer: LONG POINTER] RETURNS [did: DID] = { did _ NEW[DIDRep]; TRUSTED {PBasics.Move[dst: LOOPHOLE[did], src: buffer, nWords: BYTES[DIDRep]/PBasics.bytesPerWord];}; }; HashDID: PUBLIC PROC [did: DID] RETURNS [hash: CARD32] = { IF did = NIL THEN ERROR; hash _ PBasics.BITXOR[did.didHigh, did.didLow]; }; StableHashDID: PUBLIC PROC [did: DID] RETURNS [hash: CARD32] = { hashTemp: PBasics.LongNumber; hashTemp.card _ PBasics.BITXOR[did.didHigh, did.didLow]; hash _ hashTemp.hh + hashTemp.hl + hashTemp.lh + hashTemp.ll; hash _ PBasics.BITAND[hash, 0FFh]; }; NextTimeStamp: PUBLIC PROC [current: YggRep.TimeStamp] RETURNS [next: YggRep.TimeStamp] ~ { next _ [current + 1]; }; MaxTimeStamp: PUBLIC PROC [ts1: YggRep.TimeStamp, ts2: YggRep.TimeStamp] RETURNS [maxTS: YggRep.TimeStamp] ~ { maxTS _ IF ts1 > ts2 THEN ts1 ELSE ts2; }; CompareTimeStamps: PUBLIC PROC [ts1: YggRep.TimeStamp, ts2: YggRep.TimeStamp] RETURNS [PBasics.Comparison] ~ { SELECT TRUE FROM ts1 > ts2 => RETURN[greater]; ts1 < ts2 => RETURN[less]; ENDCASE => RETURN[equal]; }; FirstDID _ NEW[DIDRep]; FirstDID^ _ [0,0]; LastDID _ NEW[DIDRep]; LastDID^ _ [LAST[CARD32], LAST[CARD32]]; END. |YggDIDImpl.mesa Copyright Σ 1988, 1989 by Xerox Corporation. All rights reserved. Bob Hagmann January 4, 1989 2:48:24 pm PST Handle all operations on DID's. Exported procedures Validate the did. Compare the did and stableDID. Compare the dids. Return the size of the did. The size in in bytes rounded up to the next word. Take a DID and write it to a buffer. Take a buffer and construct a DID. A did always hashes to the same value for any given version of the software (this is only for volatile use!) A did always hashes to the same value for all versions of the software (this is for stable use) Initialization Κ€˜code•Mark outsideHeaderšœ™KšœB™BKšœ*™*—K™K™K™šΟk ˜ Kšœœ˜(Kšœœœœ.˜KKšœœœ˜Kšœœ˜KšœœR˜eKšœ œ˜&Kšœœ˜#Kšœœ ˜—K˜KšΡbln œœ˜Kšœ˜#Kšœ˜%šœ˜K˜Kšœœœ˜K˜Kšœ œœ˜Kšœœœ˜+K˜Kšœ œœ˜Kšœ œœ˜K˜Kšœœœf˜€Kšœœœh˜„Kšœœœe˜~K˜K˜Kš Οnœœœœœœ˜B—headšœ™š Ÿ œ œœœ œ˜AKšΟoœ œ™Kš œLœœœœ˜fK˜K™—šŸ œœœœ œœœ˜\Kšœ  œ  œ™Kšœœœœ˜Kšœœœœ˜Kšœœ ˜Kšœœœœ˜šœ˜ šœ ˜Kšœœ ˜#Kšœœ˜ šœœ ˜!Kšœœ ˜"Kšœœ˜Kšœœ ˜——K˜—˜K™——š Ÿ œ œœœœ œ˜GKšœ  œ™Kšœ"œœ˜0Kšœ!œœ˜0Kšœœœœœœœœ˜cK˜K™—š Ÿ œœœœœ œ˜;K™NKšœ ˜ Kšœœœœ˜Kšœ ˜ Kšœ˜K˜K™—š Ÿ œœœœ œœ˜>Kšœœ™$Kšœ œœœ˜Kšœ!œœ!˜eK˜K™—šŸ œœœ œœœœ˜HKšœœ™"K˜Kšœœœ!˜eK˜—K™š Ÿœœœœœœ˜:K™lKšœ œœœ˜Kšœœ˜/K˜K™—š Ÿ œœœœœœ˜@K™_Kšœœ ˜Kšœœ˜8Kšœ=˜=Kšœœ ˜"K˜K™—šŸ œ œœ˜[Kšœ˜K˜K™—šŸ œœœ0œ˜nKšœœ œœ˜'K˜K™—šŸœœœ0œ˜nšœœ˜Kšœ œ ˜Kšœ œ˜Kšœœ˜—K˜K™K™——™Kšœ œ ˜K˜Kšœ œ ˜Kš œ œœœœ˜(—K˜Kšœ˜—…— –Ά