DIRECTORY FSLock; FSPkgRefImpl: CEDAR MONITOR EXPORTS FSLock = BEGIN RecordREF: PUBLIC ENTRY PROC [r: REF] = BEGIN p: REF PRTEntry = NEW [PRTEntry]; hash: CARDINAL = Hash[r]; p.ref _ r; p.chain _ prt[hash]; prt[hash] _ p; recorded _ recorded + 1; END; RemoveREF: PUBLIC ENTRY PROC [r: REF] = BEGIN hash: CARDINAL = Hash[r]; p, q: REF PRTEntry; q _ prt[hash]; IF q.ref = r THEN prt[hash] _ q.chain ELSE DO p _ q; q _ q.chain; IF q.ref = r THEN {p.chain _ q.chain; EXIT}; ENDLOOP; q.ref _ NIL; removed _ removed + 1; END; buckets: CARDINAL = 251; PackageReferenceTable: TYPE = ARRAY [0..buckets) OF REF PRTEntry; PRTEntry: TYPE = RECORD [chain: REF PRTEntry, ref: REF]; prt: REF PackageReferenceTable _ NEW [PackageReferenceTable _ ALL[NIL]]; Hash: PROC [r: REF] RETURNS [CARDINAL] = INLINE { RETURN [ LOOPHOLE[r, LONG CARDINAL] MOD buckets] }; recorded, removed: INT _ 0; 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 p: REF PRTEntry _ prt[i], p.chain UNTIL p = 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. ŒFSPkgRefImpl.mesa Last Edited by: Schroeder, November 15, 1983 1:35 pm Exported to FSOpenFile Package Reference Table PRT statistics ΚΟ– "cedar" style˜Icode2šœ™K™4code1šΟk ˜ Lšœ˜—šœœ˜Lšœ˜Lšœ˜—šœ™š Οn œœœœœ˜'Kš˜Kšœœ œ ˜!Kšœœ ˜K˜ K˜K˜Kšœ˜Kšœ˜—š ž œœœœœ˜'Kš˜Kšœœ ˜Kšœœ ˜Kšœ˜šœ ˜ Kšœ˜šœ˜K˜K˜ Kšœ œœ˜,Kšœ˜——Kšœœ˜ K˜Kšœ˜——™Kšœ œ˜Kš œœœœœ ˜AKš œ œœ œœ˜9Kš œœœœœ˜Hš žœœœœœ˜/Kš œœœœœœ ˜5——™Kšœœ˜šžœœœœœ œ œœ˜YKš˜Kšœ ˜ Kšœ˜Kšœ œ˜šœœœ˜$Kšœ œ˜Kšœœ˜š œœœœ˜6K˜Kšœ˜—Kšœ˜Kšœœ˜>Kšœ œ˜Kšœ$˜$Kšœ˜—Kšœ˜——Kšœ˜—…—X³