-- PSBDefs.Mesa  Edited by Sandman on June 30, 1980  5:01 PM
-- Copyright  Xerox Corporation 1979, 1980
DIRECTORY
  ControlDefs USING [FrameHandle],
  ProcessDefs USING [Priority, Ticks];
PSBDefs: DEFINITIONS =
  BEGIN
  MonitorLock: TYPE = MACHINE DEPENDENT RECORD [
    lock: {locked, unlocked}, -- priority: Priority,
    queue: PackedQueue];
  MonitorHandle: TYPE = POINTER TO MonitorLock;
  LockedEmpty: MonitorLock = [locked, Empty];
  UnlockedEmpty: MonitorLock = [unlocked, Empty];
  -- NOTE: Both fields of a MonitorLock are packed into the same word, with
  --   the lock in the high-order bit and "locked" represented by zero, so
  --   that a MonitorHandle to a locked MonitorLock can be loopholed into a
  --   QueueHandle.
  Condition: TYPE = MACHINE DEPENDENT RECORD [
    wakeupWaiting: {no, yes}, queue: PackedQueue, timeout: ProcessDefs.Ticks];
  ConditionHandle: TYPE = POINTER TO Condition;
  -- NOTE: The first two fields of a Condition are packed into the same word,
  --   with wakeupWaiting in the high-order bit and "no" represented by zero,
  --   so that a ConditionHandle to a Condition without a waiting wakeup can
  --   be loopholed into a QueueHandle.
  ProcessHandle: TYPE = POINTER TO PSB;
  PSB: TYPE = MACHINE DEPENDENT RECORD [
    link: ProcessHandle,
    cleanup: ProcessHandle,
    timeout: ProcessDefs.Ticks,
    enterFailed: BOOLEAN,
    detached: BOOLEAN,
    fill: [0..37B],
    state: {frameReady, frameTaken, dead, alive},
    timeoutAllowed, abortPending, timeoutPending, waitingOnCV: BOOLEAN,
    priority: ProcessDefs.Priority,
    frame: ControlDefs.FrameHandle];
  PackedQueue: TYPE = POINTER [0..77777B] TO PSB;
  Empty: PackedQueue = FIRST[PackedQueue];
  END.