-- Copyright (C) 1984  by Xerox Corporation. All rights reserved. 
-- SLDefs.mesa	Transport Mechanism Mail Server - public DEFS for SL queues

-- HGM: 10-Dec-84 21:52:36
-- Andrew Birrell  September 13, 1982 3:36 pm --
-- Hankins	31-Jul-84  8:27:59	Klamath update (defs for SLRestart)

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

  -- things for SLRestart use ONLY:

  RestartQueues: PROCEDURE [initHeap: BOOLEAN];

  END.