-- File: PerfPrivate.mesa
-- Edited by Sandman on September 19, 1980  11:51 AM

DIRECTORY
  PerfStructures USING [
    FrameHandle, GlobalFrameHandle, LongNumber, NullGlobalFrame, PsbHandle, RealPC];

PerfPrivate: DEFINITIONS =
  BEGIN OPEN PerfStructures;

  Number: TYPE = LONG CARDINAL;
  LongNumber: TYPE = PerfStructures.LongNumber;
  OverFlowNumber: Number = 20000000B;

  NodeID: TYPE = RECORD [pc: RealPC, frame: GlobalFrameHandle];

  NullID: NodeID = [[0], NullGlobalFrame];

  CallClass: TYPE = {perf, normal};
  LegAddClass: TYPE = {none, successor};
  LegTrackClass: TYPE = {none, successor, all};

  VersionID: CARDINAL = 09190;

  PerfControlRecord: TYPE = MACHINE DEPENDENT RECORD [
    measuringNow(0): BOOLEAN,
    nodeTable(1): POINTER TO NodeTab,
    legTable(2): POINTER TO LegTab,
    process(3): PsbHandle,
    lastCall(4): CallClass,
    trackLeg(5): LegTrackClass,
    addLeg(6): LegAddClass,
    totalBreaks(7): LONG CARDINAL,
    perfTime(9): LONG CARDINAL,
    totalTime(11): LONG CARDINAL,
    lastID(13): NodeIndex,
    nextLeg(14): CARDINAL,
    nextNode(15): CARDINAL,
    histFree(16): HistIndex,
    histBase(17): HistBase,
    saveBreakHandler(18): FrameHandle,
    self(19): FrameHandle,
    newSession(20): BOOLEAN,
    version(21): CARDINAL,
    pulseConversion(22): LONG CARDINAL ← NULL];

  MaxNodes: CARDINAL = 20; -- maximum number of nodes tracked
  NodeIndex: TYPE = CARDINAL [0..MaxNodes + 1];
  NullNode: NodeIndex = MaxNodes;
  AllNodes: NodeIndex = MaxNodes + 1;
  HighBits: CARDINAL = 77B;
  SubNodeIndex: TYPE = NodeIndex [0..MaxNodes);

  Node: TYPE = RECORD [
    id: NodeID,
    hitsLow: CARDINAL,
    hist: HistIndex,
    overflowed: BOOLEAN,
    hitsHigh: [0..HighBits]];

  NodeTab: TYPE = ARRAY SubNodeIndex OF Node;

  MaxLegs: CARDINAL = 40; -- maximum number of legs tracked
  NoLegSlot: LegIndex = MaxLegs + 1;
  LegIndex: TYPE = CARDINAL [0..MaxLegs + 1];
  SubLegIndex: TYPE = LegIndex [0..MaxLegs);

  Leg: TYPE = RECORD [
    start: Number,
    lock: BOOLEAN,
    from, to: NodeIndex,
    sum: Number,
    owner: UNSPECIFIED,
    hitsLow: CARDINAL,
    hist: HistIndex,
    overflowed, someIgnored: BOOLEAN,
    hitsHigh: [0..HighBits]];

  LegTab: TYPE = ARRAY SubLegIndex OF Leg;

  HistClass: TYPE = {linear, log};
  HistType: TYPE = {node, leg};

  Histogram: TYPE = RECORD [
    count, scale: CARDINAL,
    sum: Number,
    type: HistType,
    class: HistClass,
    nBuckets: [0..377B],
    overflow: CARDINAL,
    underflow: CARDINAL,
    base: Number,
    buckets: ARRAY [0..0) OF CARDINAL];

  HistBase: TYPE = BASE POINTER;
  HistIndex: TYPE = HistBase RELATIVE ORDERED POINTER [0..HistSpaceSize) TO
    Histogram;
  NullHist: HistIndex = LAST[HistIndex];
  HistSpaceSize: CARDINAL = 256;

  PCR: TYPE = POINTER TO PerfControlRecord;
  ReadWrite: TYPE = {read, write};

  END.