-- Registration Server - Defs for using heap as a registry.
-- [Juniper]<Grapevine>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.