-- Transport Mechanism Filestore - private DEFS for heap object directory. --

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

-- Andrew Birrell	 3-Jun-81 12:59:45 --
-- M. D. Schroeder        7-Feb-83 15:28:39


DIRECTORY
  ObjectDirDefs USING [ObjectNumber, ObjectType, noObject],
  VMDefs USING [FullAddress];

ObjectDirXDefs: DEFINITIONS =
  BEGIN

  ObjectNumber: TYPE = ObjectDirDefs.ObjectNumber;

  gapObjectNumber: ObjectNumber = ObjectDirDefs.noObject;
  -- an object number that 'NewObject' will never return --

  NewObject: PROCEDURE [VMDefs.FullAddress, ObjectDirDefs.ObjectType]
    RETURNS [ObjectNumber];
  -- sets reference count to one --

  ObjectBase: PROCEDURE [ObjectNumber] RETURNS [VMDefs.FullAddress];


  -- Compactor interface --

  DOPC: TYPE = LONG CARDINAL;
  -- "DeletedObjectPageCount";  see comments in GetObjectState

  ObjectState: TYPE = {inUse, unused, duplicate};

  GetObjectState: PROCEDURE [
    obj: ObjectNumber, where: VMDefs.FullAddress, dorpc: DOPC -- "r" = read -- ]
    RETURNS [ObjectState];
  -- If object's reference count is non-zero, returns "inUse".
  -- If reference count is zero, but base#where, returns "duplicate"
  -- Otherwise returns "unused", and marks object as free with dopc=dorpc
  -- Object numbers are re-used only if their dopc is <= compactor's
  -- most recently reported dofpc.

  ReportDofpc: PROCEDURE [dofpc: DOPC -- "f" = flushed -- ];
  -- Compactor has overwritten objects whose dopc is <= dofpc.

  MoveObject: PROCEDURE [ObjectNumber, VMDefs.FullAddress];
  -- Compactor has moved start of object to given address --

  ReleaseObject: PROCEDURE [obj: ObjectNumber];
  -- To be used by Write.HeapAbandonWrite when a writer has been abandoned.
  -- The reference count for object must be zero.
  -- The object cannot be a "temp" object.

  END.