-- Registration Server - Defs for using heap as a registry. -- [Juniper]MS>RegistryDefs.mesa -- J. Dion, September 10, 1979. -- Andrew Birrell 27-Oct-82 15:42:16 DIRECTORY BodyDefs USING [RName, Timestamp], HeapDefs USING [ReaderHandle, WriterHandle], ProtocolDefs USING [Connect, RNameType, Password]; RegistryDefs: DEFINITIONS = BEGIN Copy: PROC[reader: HeapDefs.ReaderHandle, writer: HeapDefs.WriterHandle]; -- copies one component of an entry -- Skip: PROC[reader: HeapDefs.ReaderHandle]; -- skips one component of an entry -- SkipIfEmpty: PROC[reader: HeapDefs.ReaderHandle] RETURNS[empty: BOOLEAN]; -- skips one component if the component is empty, else no-op -- WriteList: PROC[writer: HeapDefs.WriterHandle, name: BodyDefs.RName, stamp: BodyDefs.Timestamp]; -- writes four components to the writer: an RList of one item, name, -- (or empty if name is NIL), a StampList of one item, stamp, -- (or empty if name is NIL), an empty RList, and an empty StampList. StartSublist: PROC RETURNS[ HeapDefs.WriterHandle ]; AddNameToSublist: PROC[writer: HeapDefs.WriterHandle, name: BodyDefs.RName ]; EndSublist: PROC[writer: HeapDefs.WriterHandle, count: CARDINAL] RETURNS[reader: HeapDefs.ReaderHandle]; -- writes component length and following stamp list and deleted list -- EnumerateRList: PROC[reader: HeapDefs.ReaderHandle, work: PROC[BodyDefs.RName]RETURNS[done:BOOLEAN] ]; -- enumerates the R-Names in the current component -- UpdateInfo: TYPE = { done, noChange, outOfDate }; AddName: PROC[reader: HeapDefs.ReaderHandle, name: BodyDefs.RName, stamp: POINTER TO BodyDefs.Timestamp, writer: HeapDefs.WriterHandle] RETURNS[ UpdateInfo ]; -- adds name to current list,copying list into writer. Returns "noChange" -- if name is already on list, "outOfDate" if name is already deleted -- with superior timestamp -- RemoveName: PROC[reader: HeapDefs.ReaderHandle, name: BodyDefs.RName, stamp: POINTER TO BodyDefs.Timestamp, writer: HeapDefs.WriterHandle] RETURNS[ UpdateInfo ]; -- removes name from current list, copying list into writer. Returns -- "noChange" if name is not on list, "outOfDate" if name is on list -- with superior timestamp -- MergeLists: PROC[reader1, reader2: HeapDefs.ReaderHandle, writer: HeapDefs.WriterHandle] RETURNS[newer1, newer2: BOOLEAN]; -- readers 1 and 2 must be positioned at the start of lists to be merged. -- Where the added and deleted sublists are considered as sets -- A1 A2 D1 D2 , the result contains the sublists A1 + A2 - (D1 + D2) -- and D1 + D2 - (A1 + A2),' with appropriate timestamps. -- The returned values specify whether information from each reader was -- copied to the merge lists. ReadPrefix: PROC[reader: HeapDefs.ReaderHandle, name: BodyDefs.RName] RETURNS[type: ProtocolDefs.RNameType, stamp: BodyDefs.Timestamp]; -- reads the prefix of an entry -- WritePrefix: PROC[writer: HeapDefs.WriterHandle, type: ProtocolDefs.RNameType, stamp: POINTER TO BodyDefs.Timestamp, name: BodyDefs.RName]; -- writes a prefix for an entry -- ReadPassword: PROC[reader: HeapDefs.ReaderHandle] RETURNS [pw: ProtocolDefs.Password, stamp: BodyDefs.Timestamp]; -- reads the password of an individual. WritePassword: PROC[writer: HeapDefs.WriterHandle, pw: ProtocolDefs.Password, stamp: BodyDefs.Timestamp]; -- writes the password at the current location in the heap object. ReadConnect: PROC[reader: HeapDefs.ReaderHandle, connect: ProtocolDefs.Connect] RETURNS [stamp: BodyDefs.Timestamp]; -- Returns the connect-site of an individual. WriteConnect: PROC[writer: HeapDefs.WriterHandle, connect: ProtocolDefs.Connect, stamp: BodyDefs.Timestamp]; -- writes the connect-site at the current location in the heap object. Comparison: TYPE = {less, equal, greater}; CompareRNames: PROC[n1, n2: BodyDefs.RName] RETURNS[RegistryDefs.Comparison]; CompareTimestamps: PROC[t1, t2: BodyDefs.Timestamp] RETURNS [Comparison]; -- compares two timestamps in terms of temporal ordering. MakeTimestamp: PROCEDURE RETURNS [stamp: BodyDefs.Timestamp]; -- produces a new unique timestamp, waiting if necessary. CheckStampList: PROC[reader: HeapDefs.ReaderHandle, limit: BodyDefs.Timestamp] RETURNS[old: BOOLEAN]; -- checks whether any of the stamps are older than given value. -- If so, leaves reader at undefined point. FilterStampList: PROC[reader: HeapDefs.ReaderHandle, limit: BodyDefs.Timestamp, writer: HeapDefs.WriterHandle]; -- Reader should be positioned at namelist component. -- Copies to writer the names and stamps newer than the limit. END.