-- 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.