-- Transport Mechanism Filestore - public DEFS for heap object management. --

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

-- Andrew Birrell  24-Feb-81 15:55:22 --

DIRECTORY
  VMDefs USING [PageIndex, PageNumber];

ObjectDirDefs: DEFINITIONS =
  BEGIN

  ObjectNumber: TYPE = MACHINE DEPENDENT RECORD [
    page: PRIVATE VMDefs.PageNumber,
    fill: PRIVATE [0..16),
    type: PUBLIC ObjectType,
    index: PRIVATE VMDefs.PageIndex];

  noObject: ObjectNumber = [page: 0, fill: 0, type: gap, index: 0];
  -- A value of "ObjectNumber" which is never be that of a heap object --

  ObjectType: TYPE = MACHINE DEPENDENT{
    gap(0) --internal-- , body(1), SLinput(2), SLpending(3), SLforward(4),
    RSobject(5), RSmail(6), temp(7), RSname(8), MSname(9), testMode(10), TOC(11),
    archived(12), delArch(13), spare16(14), spare17(15)};
  -- types of object recorded in heap; limited by field in ObjectNumber
  -- (recorded in ObjectHeader on disk) --

  UseObject: PROC [ObjectNumber];
  -- Checks that reference count exceeds zero, then increments reference
  -- count --

  FreeObject: PROC [ObjectNumber];
  -- Checks that reference count exceeds zero, then decrements reference
  -- count --



  -- Procedures used by clients while restarting --

  RestartObject: PROC [ObjectNumber];
  -- Increments reference count.  Unlike 'UseObject', will not complain if
  -- reference count was zero --

  Enumerate: PROC [
    type: ObjectType, proc: PROCEDURE [ObjectNumber] RETURNS [BOOLEAN]]
    RETURNS [ObjectNumber];
  -- Calls "proc" in turn with the ObjectNumber of each object of the
  -- given type currently existing in the heap storage (excluding those
  -- which are still being written), until "proc" returns TRUE.  This may
  -- include objects whose reference count is zero.  If "proc" ever
  -- returns TRUE, this procedure returns the last object number that was
  -- given to "proc", otherwise this procedure returns "noObject". --

  END.