-- File: PupTimeServerCold.mesa - last edit:
-- AOF                 17-Feb-88 17:01:49
-- HGM                 23-Sep-83  3:00:54
-- Copyright (C) 1983, 1988 by Xerox Corporation. All rights reserved. 

DIRECTORY
  Event USING [aboutToSwap],
  EventTypes USING [aboutToBoot, aboutToBootPhysicalVolume],
  Supervisor USING [
    AddDependency, AgentProcedure, CreateSubsystem, RemoveDependency,
    SubsystemHandle],

  MiscServerDefs USING [
    PupMiscServerOn, PupMiscServerOff, IgnoreThisPacket, SetTimeServer],
  PupTimeServer USING [],
  PupTimeServerOps USING [PupTimeServer],
  Stats USING [StatCounterIndex, StatsStringToIndex],
  StatsOps USING [StatArray, statGrand];

PupTimeServerCold: PROGRAM
  IMPORTS
    Event, Supervisor, MiscServerDefs, PupTimeServerOps, Stats, StatsOps
  EXPORTS PupTimeServer, PupTimeServerOps =
  BEGIN OPEN Stats;

  broom: Supervisor.SubsystemHandle = Supervisor.CreateSubsystem[Broom];

  useCount: CARDINAL ← 0;
  pleaseStop, running: PUBLIC BOOLEAN ← FALSE;
  resetText: PUBLIC LONG STRING ← [50];

  stats: StatsOps.StatArray ← StatsOps.statGrand;
  statAlto, statTenex, statText: PUBLIC StatCounterIndex;


  GetAltoTimeRequests: PUBLIC PROCEDURE RETURNS [LONG CARDINAL] =
    BEGIN
    RETURN[stats[statAlto]];
    END;
    
  GetTenexTimeRequests: PUBLIC PROCEDURE RETURNS [LONG CARDINAL] =
    BEGIN
    RETURN[stats[statTenex]];
    END;
    
  GetTextTimeRequests: PUBLIC PROCEDURE RETURNS [LONG CARDINAL] =
    BEGIN
    RETURN[stats[statText]];
    END;

  PupTimeServerOn: PUBLIC PROCEDURE =
    BEGIN
    IF (useCount ← useCount + 1) = 1 THEN
      BEGIN
      Supervisor.AddDependency[client: broom, implementor: Event.aboutToSwap];
      running ← TRUE;
      Starter[];
      END;
    END;

  Starter: PROCEDURE =
    BEGIN
    MiscServerDefs.PupMiscServerOn[];
    MiscServerDefs.SetTimeServer[PupTimeServerOps.PupTimeServer];
    pleaseStop ← FALSE;
    END;

  PupTimeServerOff: PUBLIC PROCEDURE =
    BEGIN
    IF useCount # 0 AND (useCount ← useCount - 1) = 0 THEN
      BEGIN
      running ← FALSE;
      Stopper[];
      Supervisor.RemoveDependency[client: broom, implementor: Event.aboutToSwap];
      END;
    END;

  Stopper: PROCEDURE =
    BEGIN
    MiscServerDefs.PupMiscServerOff[];
    MiscServerDefs.SetTimeServer[MiscServerDefs.IgnoreThisPacket];
    pleaseStop ← TRUE;
    END;


  SetupTimeServerThings: PUBLIC PROCEDURE =
    BEGIN
    statText ← StatsStringToIndex["Text Date Requests"];
    statTenex ← StatsStringToIndex["Tenex Date Requests"];
    statAlto ← StatsStringToIndex["Alto Date Requests"];
    END;

  Broom: Supervisor.AgentProcedure =
    BEGIN
    SELECT event FROM
      EventTypes.aboutToBoot, EventTypes.aboutToBootPhysicalVolume =>
        IF running THEN Stopper[];
      ENDCASE => NULL;
    END;

  SetupTimeServerThings[];
  END.