-- Transport Mechanism Mail Server - public DEFS for SL queues --

-- [Indigo]<Grapevine>MS>SLDefs.mesa

-- Andrew Birrell  September 13, 1982 3:36 pm -- 

DIRECTORY
BodyDefs	USING[ Timestamp ],
HeapDefs	USING[ ReaderHandle, WriterHandle ],
ObjectDirDefs	USING[ ObjectNumber ],
ServerDefs	USING[ ServerHandle ],
VMDefs		USING[ pageSize, PageAddress ];


SLDefs:	DEFINITIONS = BEGIN

-- General --

SLQueue:	TYPE = { express, input, forward, pending, foreign, mailbox };

ItemIndex:	TYPE = [0 .. VMDefs.pageSize / SIZE[Item] );

ItemAddress:	TYPE = RECORD[ page: VMDefs.PageAddress, item: ItemIndex ];

Item:		TYPE = MACHINE DEPENDENT RECORD[
		    body:	ObjectDirDefs.ObjectNumber,
		    SL:   	ObjectDirDefs.ObjectNumber,
		    state:	{free, full, reading} --2 bits--,
		    fill:	[0..16383] --ugh! 14 bits-- ];

SLHeader:	TYPE = MACHINE DEPENDENT RECORD[
		    created:	BodyDefs.Timestamp,
		    received:	BodyDefs.Timestamp,
		    server:	ServerDefs.ServerHandle ];
		   -- placed at start of each steering list --

-- Writer (single event) --

SLWrite:	PROCEDURE[
		    body:	ObjectDirDefs.ObjectNumber,
		    SL:  	HeapDefs.WriterHandle,
		    queue:	SLQueue ];
		    -- Adds a message, consisting of the data which has
		    -- previously been written on the given message body
		    -- and steering list, to the given queue.  Increments
		    -- the reference count on the message body. 
		    -- Subsequent use of this WriterHandle is illegal. --

-- Reader (many per queue) --

SLReadHandle:	TYPE = ItemAddress;

WaitForNonEmpty: PROCEDURE[ queue: SLQueue ];
   -- returns when the queue is non-empty --

GetCount:	PROCEDURE[ queue: SLQueue ]
		  RETURNS[CARDINAL];
   -- returns the queue length, 0 if it's empty --

SLStartRead:	PROCEDURE[ queue: SLQueue ] RETURNS[
		    handle:	SLReadHandle,
		    body:	ObjectDirDefs.ObjectNumber,
		    SL:  	HeapDefs.ReaderHandle ];
   -- Waits until the queue is non-empty.
   -- Gives caller exclusive right to read the message
   -- body and steering list of the next item in the
   -- given queue. --

SLTransfer:	PROCEDURE[ handle: SLReadHandle, queue: SLQueue ];
   -- Abandons reading an item from a queue, and
   -- transfers it from its present queue to the given
   -- one.  The caller is responsible for terminating
   -- reading the associated steering list.  Subsequent
   -- use of this SLReadHandle is illegal. --

SLEndRead:	PROCEDURE[ handle: SLReadHandle ];
		    -- Deletes the item from the queue.  Decrements the
		    -- reference counts on the associated message body and
		    -- steering list.  The caller is responsible for
		    -- terminating reading the associated steering list. 
		    -- Subsequent use of this SLReadHandle is illegal. --

END.