-- Copyright (C) 1986  by Xerox Corporation. All rights reserved. 
-- CRuntimeInternal.mesa
-- NFS     3-Mar-86 13:29:05

DIRECTORY
  CString USING [CString],
  File USING [File],
  PrincOps USING [GlobalFrameHandle],
  Stream USING [Handle];

CRuntimeInternal: DEFINITIONS = {

  ConfigEntry: TYPE = RECORD [
    config: CARDINAL,
    gf: PrincOps.GlobalFrameHandle,
    heap: UNCOUNTED ZONE,
    openStreams: StreamList,
    stdin, stdout, stderr: Stream.Handle,
    link: ConfigHandle,
    data: LONG POINTER TO ArraySpace];
  ConfigHandle: TYPE = LONG POINTER TO ConfigEntry;

  CEList: ConfigHandle;

  gfTableSize: CARDINAL = 50;
  GFEntry: TYPE = RECORD [
    gf: GlobalFrameHandle, config: ConfigHandle, link: GFList,
    data: LONG POINTER TO ArraySpace];
  GFList: TYPE = LONG POINTER TO GFEntry;
  GFIndex: TYPE = CARDINAL [0..gfTableSize);
  GFTable: TYPE = ARRAY GFIndex OF GFList ← ALL[NIL];

  gfTable: LONG POINTER TO GFTable;

  shTableSize: CARDINAL = 50;
  SHTable: TYPE = ARRAY SHIndex OF SHList ← ALL[NIL];
  SHIndex: TYPE = [0..shTableSize);
  SHList: TYPE = LONG POINTER TO SHEntry;
  SHEntry: TYPE = RECORD [sh: Stream.Handle, refCount: CARDINAL, link: SHList];

  shTable: LONG POINTER TO SHTable;

  processTableSize: CARDINAL = 17;
  ProcessTable: TYPE = ARRAY ProcessIndex OF ProcessList ← ALL[NIL];
  ProcessIndex: TYPE = [0..processTableSize);
  ProcessList: TYPE = LONG POINTER TO ProcessEntry;
  ProcessEntry: TYPE = RECORD [
    p: PROCESS, config: ConfigHandle, link: ProcessList];

  processTable: LONG POINTER TO ProcessTable;

  StreamList: TYPE = LONG POINTER TO StreamEntry;
  StreamEntry: TYPE = RECORD [sH: Stream.Handle, link: StreamList];

  ArraySpace: TYPE = RECORD [
    space, nextArray: LONG POINTER,
    words: LONG CARDINAL,
    firstArrayOffset: CARDINAL,
    filePart: SELECT size: * FROM small => [], large => [file: File.File] ENDCASE];

  GlobalFrameHandle: TYPE = PrincOps.GlobalFrameHandle;

  MainArgsNeeded: SIGNAL
    RETURNS [argC: CARDINAL, argV: LONG POINTER TO CString.CString];

  lock: MONITORLOCK;

  SetConfig: PROCEDURE [
    gf: GlobalFrameHandle, stdin, stdout, stderr: Stream.Handle];

  ResetConfig: PROCEDURE [
    gf: GlobalFrameHandle, stdin, stdout, stderr: Stream.Handle];

  LogCleanUp: PROCEDURE [cH: ConfigHandle] RETURNS [cleanUpNeeded: BOOLEAN];

  DeleteAndLogHeap: PROCEDURE [z: UNCOUNTED ZONE];

  DeleteAndLogStream: PROCEDURE [sH: Stream.Handle];

  }.