DIRECTORY Ascii USING [Upper], Basics USING [BITOR, BITSHIFT, BITXOR], FSLock USING [ActiveFile, ActiveFileObject], FSBackdoor USING [Version], Rope USING [Concat, Equal, InlineFetch, Length, ROPE]; FSLockTableImpl: CEDAR MONITOR IMPORTS Ascii, Basics, Rope EXPORTS FSLock = BEGIN LookupLock: PUBLIC ENTRY PROC [prefix, nameBody: Rope.ROPE, version: FSBackdoor.Version] RETURNS [a: FSLock.ActiveFile] = BEGIN hash: CARDINAL; IF Rope.InlineFetch[nameBody, 0] # '[ AND prefix # NIL THEN nameBody _ Rope.Concat[prefix, nameBody]; hash _ Hash[nameBody, version]; lookups _ lookups + 1; FOR a _ lockTbl[hash], a.next UNTIL a = NIL DO IF version = a.version AND Rope.Equal[nameBody, a.nameBody, FALSE] THEN RETURN; ENDLOOP; newActiveFiles _ newActiveFiles + 1; a _ NEW [FSLock.ActiveFileObject]; a.nameBody _ nameBody; a.version _ version; a.h _ NIL; a.fileLock _ none; a.recordLock _ FALSE; a.fileLockCount _ 0; a.attachedTo _ NIL; a.next _ lockTbl[hash]; lockTbl[hash] _ a; END; RemoveLock: PUBLIC ENTRY PROC [a: FSLock.ActiveFile] = BEGIN hash: CARDINAL = Hash[a.nameBody, a.version]; aPrev: FSLock.ActiveFile _ lockTbl[hash]; removals _ removals + 1; IF aPrev = a THEN lockTbl[hash] _ a.next ELSE DO IF aPrev.next = a THEN {aPrev.next _ a.next; EXIT}; aPrev _ aPrev.next; ENDLOOP; a.nameBody _ NIL; END; lookups: INT _ 0; newActiveFiles: INT _ 0; removals: INT _ 0; buckets: CARDINAL = 509; LockTable: TYPE = ARRAY [0..buckets) OF FSLock.ActiveFile; lockTbl: REF LockTable _ NEW [LockTable _ ALL[NIL]]; Hash: PROC [name: Rope.ROPE, v: FSBackdoor.Version] RETURNS [hash: CARDINAL] = TRUSTED BEGIN OPEN Basics; len: CARDINAL = Rope.Length[name]; hash _ len + v; FOR i: CARDINAL _ 0, i+ 2 WHILE i < len DO hash _ BITOR[BITSHIFT[hash, 1], BITSHIFT[hash, -15]]; hash _ BITXOR[BITSHIFT[CHAR[Ascii.Upper[Rope.InlineFetch[name, i]]].ORD, 8], hash]; IF i+1 < len THEN hash _ BITXOR[CHAR[Ascii.Upper[Rope.InlineFetch[name, i+1]]].ORD, hash]; ENDLOOP; hash _ hash MOD buckets; END; Stats: ENTRY PROC RETURNS [items, longestChain: INT, chains: ARRAY [0..10] OF CARDINAL] = BEGIN items _ 0; longestChain _ 0; chains _ ALL[0]; FOR i: CARDINAL IN [0 .. buckets) DO chainLength: INT _ 0; cIndex: CARDINAL; FOR a: FSLock.ActiveFile _ lockTbl[i], a.next UNTIL a = NIL DO chainLength _ chainLength + 1; ENDLOOP; items _ items + chainLength; IF chainLength > longestChain THEN longestChain _ chainLength; cIndex _ MIN [chainLength, 10]; chains[cIndex] _ chains[cIndex] + 1; ENDLOOP; END; END. ΈFSLockTableImpl.mesa Last Edited by: Schroeder, November 15, 1983 1:29 pm Last Edited by: Levin, August 9, 1983 11:39 am Exported to FSLock Statistics Lock Table AFT statistics Κ– "cedar" style˜Icode2šœ™K™4K™.code1šΟk ˜ Lšœœ ˜Lš œœœœœ˜'Lšœœ ˜,Lšœ œ ˜Lšœœ&œ˜6—šœœ˜Lšœ˜Lšœ˜Lšœ˜—™š Οn œœœœœœ˜yKš˜Kšœœ˜Kšœ$œ ˜6Kšœ*˜.Kšœ˜Kšœ˜šœœœ˜.Kšœœ"œ˜BKšœœ˜ Kšœ˜—Kšœ$˜$Kšœœ˜"Kšœ˜K˜Kšœœ˜ K˜Kšœœ˜K˜Kšœœ˜K˜K˜Kšœ˜—šž œœœœ˜6Kš˜Kšœœ˜-Kšœ)˜)Kšœ˜šœ ˜ Kšœ˜šœ˜Kšœœœ˜3K˜Kšœ˜——Kšœ œ˜Kšœ˜——™ Kšœ œ˜Kšœœ˜Kšœ œ˜—™ Kšœ œ˜Kšœ œœœ˜:Kš œ œ œœœ˜4š žœœ œœœ˜VKš˜Kšœ˜ Kšœœ˜"Kšœ˜šœœ œ ˜*Kšœœœ œ ˜5Kš œœœœ)œ ˜SKš œ œœœ+œ˜ZKšœ˜—Kšœ œ ˜Kšœ˜——™šžœœœœœ œ œœ˜YKš˜Kšœ ˜ Kšœ˜Kšœ œ˜šœœœ˜$Kšœ œ˜Kšœœ˜šœ+œœ˜>K˜Kšœ˜—Kšœ˜Kšœœ˜>Kšœ œ˜Kšœ$˜$Kšœ˜—Kšœ˜——Kšœ˜—…— ¨n