-- Transport Mechanism Registration Server - Access to the B-Tree --

-- [Juniper]<Grapevine>MS>RegBTreeDefs.mesa

-- Andrew Birrell  27-Oct-82 15:56:08 --

DIRECTORY
BodyDefs:	FROM "BodyDefs"
		USING[ RName, Timestamp ],
HeapDefs:	FROM "HeapDefs"
		USING[ ObjectNumber, ReaderHandle, WriterHandle ],
ProtocolDefs:	FROM "ProtocolDefs"
		USING[ RNameType ];

RegBTreeDefs:	DEFINITIONS = BEGIN

RegBTree:	PROGRAM;

RegistryObject:	TYPE = RECORD[ type: ProtocolDefs.RNameType,
			stamp:	BodyDefs.Timestamp,
			reader: HeapDefs.ReaderHandle ];

LookupReason:	TYPE = {readNone, readGroup, readIndividual, readEither,
			readAny};

Lookup:		PROCEDURE[name: BodyDefs.RName, reason: LookupReason ]
                   RETURNS[ info: RegistryObject ];


Insert:		PROCEDURE[ name: BodyDefs.RName,
			type:	ProtocolDefs.RNameType,
			stamp:	POINTER TO BodyDefs.Timestamp,
			writer: HeapDefs.WriterHandle,
			info: POINTER TO RegistryObject ];


KnownRegistry:	PROC[name: BodyDefs.RName, yes: BOOLEAN];

-- Record that the entry (which is a group in the GV registry) is/isnt
-- a registry known locally.


RegState:	TYPE = { yes--local registry--,
			 no --non-local registry--,
			 bad--not a registry-- };

TestKnownReg:	PROC[name: BodyDefs.RName]
		RETURNS[state: RegState];

-- Tells whether the name is/isnt in a registry which is recorded as a
-- registry known locally.


UpdateFailed:	ERROR[info: RegistryObject];

-- this is raised by Insert if the relevant B-Tree entry differs from the
-- entry that existed when the corresponding Lookup was performed. 
-- The update should be re-calculated.  The parameter of this signal is
-- the info produced now by a lookup of the B-Tree.  This is the primary
-- means of synchronising on accesses to the registration server's
-- B-Tree. --


EnumerateTree: PROCEDURE[ type: ProtocolDefs.RNameType,
			  action: PROCEDURE[BodyDefs.RName] ];

-- calls "action" for each entry in the B-Tree of the given type --


MarkKnown:	SIGNAL;

-- Ugh!  But it's upwards compatible.  Raised during EnumerateTree to
-- request that entry be marked as a known registry.


KeepObject:	PROCEDURE[ name: BodyDefs.RName,
			   type: ProtocolDefs.RNameType,
			   stamp: POINTER TO BodyDefs.Timestamp,
			   number: HeapDefs.ObjectNumber ];

-- Called for object found during the restart sequence, only --


RegPurger:	PROC;
-- forks the RS BTree purger process --


END.