-- lsd.mesa May 27, 1982 2:33 pm -- Interface to the Local System Directory component of the -- Interim Cedar File System. -- what a trip... d. gifford DIRECTORY File: TYPE USING [Capability], Rope: TYPE USING [ROPE]; LSD: DEFINITIONS = { -- The LSD consists of a set of entries that are indexed in three ways: -- (1) There is name to entry map implemented by hashing -- (2) Entries can be enumerated in LRU -- (3) Dirty Entries can be enumerated -- Procedures Entry: TYPE = LONG POINTER TO EntryObject; ClearDirty: PROC[entry: Entry]; -- Marks an entry as clean. -- If the entry was not dirty ClearDirty is a nop. Create: PROC[name: Rope.ROPE, fc: File.Capability, create: LONG CARDINAL] RETURNS [entry: Entry]; -- Creates an entry in the LSD, links it into the hash chain, -- and makes it MRU. The new entry is locked in exclusive mode. -- If an entry already existed under name, it will be updated -- with the new information Delete: PROC[entry: Entry]; -- Deletes an entry in the LSD. Any locks are released. EProc: TYPE = PROCEDURE [entry: Entry] RETURNS [stop: BOOLEAN]; -- Type of procedure called when the LSD is enumerated. Enumerate: PROC[p: EProc]; -- Enumerates the LSD, MRU to LRU EnumerateLocked: PROC[p: EProc]; -- Enumerates the LSD entries that are locked GetDirty: PROC RETURNS [dirty: Entry]; -- Returns a dirty entry. -- The returned entry is locked in exclusive mode. -- If no dirty entry is found, NIL is returned. GetVictim: PROC RETURNS[victim: Entry]; -- Returns the LRU entry that is eligible for replacement. -- The returned entry is locked in exclusive mode. -- If no victim is found, NIL is returned. Lock: PROC[entry: Entry, exclusive: BOOLEAN] RETURNS [success: BOOLEAN]; -- Locks an LSD entry in share or exclusive mode. -- Returns T if it was able to set the requested lock. Lookup: PROC[name: Rope.ROPE] RETURNS [entry: Entry]; -- Looks up an entry in the LSD by name. No lock is set. -- Returns NIL if there is no entry with the specified name. -- If entry is found, it is made MRU SetDirty: PROC[entry: Entry]; -- Marks an entry dirty. Unlock: PROC[entry: Entry]; -- Clears the lock set on an entry. -- If entry is not locked, Unlock is a nop. UnlockAll: PROC[]; -- Sledge hammer to unlock everything -- Internal Structure of the LSD -- max size in pages maxSize: CARDINAL = 200; -- number of hash buckets -- don't make this so big that LSDHeader is > 4K words or the compiler croaks buckets: CARDINAL = 997; -- LSD base Base: TYPE = LONG BASE POINTER TO LSDHeader; -- LSD internal links LPtr: TYPE = Base RELATIVE LONG POINTER TO Link; Link: TYPE = RECORD [ next, last: LPtr ]; -- LSD header mruHeadOffset: LPtr = LOOPHOLE[LONG[2], LPtr]; freeHeadOffset: LPtr = LOOPHOLE[LONG[6], LPtr]; dirtyHeadOffset: LPtr = LOOPHOLE[LONG[10], LPtr]; LSDHeader: TYPE = MACHINE DEPENDENT RECORD [ version (0): LONG CARDINAL, mruChain (2): Link, freeChain (6): Link, dirtyChain (10): Link, freePointer (14): LONG CARDINAL, hash (16): ARRAY [0..buckets) OF Link ]; headerVersion: LONG CARDINAL = 23264373274B; -- LSD Entry mruOffset: LONG CARDINAL = 0; hashOffset: LONG CARDINAL = 4; dirtyOffset: LONG CARDINAL = 8; EntryObject: TYPE = MACHINE DEPENDENT RECORD [ -- mru chain mru (0): Link, -- hash links entries together in the same hash class hash (4): Link, -- dirty links together entries that are dirty dirty (8): Link, -- size of entry object in words size (12): CARDINAL, -- local name of the file fc (13): File.Capability, -- time when the file was checked at the remote server checked (19): LONG CARDINAL, -- time file last modified create (21): LONG CARDINAL, -- dirty is T if the file must be written back to the server -- free is T if this is a free entry dirtyF (23:0..0): BOOLEAN, free (23:1..15): BOOLEAN, -- remote name of the file name (24): StringBody ]; }..