-- OtherPerformers.mesa
-- Edited by Paul Rovner on 7-Jan-82 16:00:13

DIRECTORY
  Plotter USING [Create, CoCreate],
  Process USING [Pause, SecondsToTicks, Detach],
  Real USING [FixC],
  RealEvent USING [CreateTimerDrivenStream, StreamHandle, Object],
  RefAnyStream USING [CreateCoForkedProducerStream],
  RTBases USING [GetDQIS],
  RTMicrocode USING [RCFINALIZECOUNT],
  RTProcess USING [GetTotalPageFaults],
  RTRefCounts USING [QuantizedAllocatorTrapStats, PrefixedAllocatorTrapStats, GCState, ProbeSize],
  SafeStorage USING [NWordsAllocated, NWordsReclaimed],
  Timer USING[Seconds, Create, Read, Handle];

OtherPerformers: PROGRAM

IMPORTS Plotter, Process, Real, RealEvent, RefAnyStream, RTBases, RTMicrocode, RTProcess, RTRefCounts, SafeStorage, Timer

= BEGIN

  samplingInterval: Timer.Seconds = 5;
  nEvents: NAT = 100;
  testingCoForkStuff: BOOLEAN = FALSE;
  
  
-- SAMPLING PROCEDURES

QuantaISSampler: PROC[s: REF ANY] RETURNS[REAL] =
  {RETURN[RTBases.GetDQIS[]];
  };
  
WordsISSampler: PROC[s: REF ANY] RETURNS[REAL] =
  {RETURN[SafeStorage.NWordsAllocated[] - SafeStorage.NWordsReclaimed[]];
  };
  
FinalizeCountSampler: PROC[s: REF ANY] RETURNS[REAL] =
  {RETURN[RTMicrocode.RCFINALIZECOUNT[]];
  };
  
RCOverflowUsageSampler: PROC[s: REF ANY] RETURNS[REAL] =
  {overflowUsage: REAL = RTRefCounts.GCState.GCEventCounters.OTCellCreate - RTRefCounts.GCState.GCEventCounters.OTCellDelete;
   RETURN[overflowUsage];
  };
  
RCTableFullnessSampler: PROC[s: REF ANY] RETURNS[REAL] =
  {htFullness: REAL ← RTRefCounts.GCState.GCEventCounters.HTCellCreate - RTRefCounts.GCState.GCEventCounters.HTCellDelete;
   RETURN[(htFullness*100.0)/RTRefCounts.ProbeSize];
  };
  
AllocTrapsSampler: PROC[s: REF ANY] RETURNS[REAL] =
  {RETURN[RTRefCounts.PrefixedAllocatorTrapStats.ZoneLockedTraps
		                 + RTRefCounts.PrefixedAllocatorTrapStats.NoBlockFoundTraps
				 + RTRefCounts.PrefixedAllocatorTrapStats.LongFreeListTraps
				 + RTRefCounts.QuantizedAllocatorTrapStats.ZoneLockedTraps
		                 + RTRefCounts.QuantizedAllocatorTrapStats.NoBlockFoundTraps
				 + RTRefCounts.QuantizedAllocatorTrapStats.LongFreeListTraps];
  };
  
RCOpsSampler: PROC[s: REF ANY] RETURNS[REAL] =
  {RETURN[RTRefCounts.GCState.GCEventCounters.AlterCountDecrement
		              + RTRefCounts.GCState.GCEventCounters.AlterCountIncrement
			      + RTRefCounts.GCState.GCEventCounters.AlterCountZeroChange*2];
  };
  
PageFaultSampleProducer: PROC[self: REF ANY,sink: RealEvent.StreamHandle] =
  {timer: Timer.Handle = Timer.Create[];
   dt: CARDINAL = Real.FixC[samplingInterval];  -- seconds
   DO
      sink.procs.put[sink, NEW[RealEvent.Object ← [sampleValue: RTProcess.GetTotalPageFaults[],
                                                   time: timer.Read[].time]]];
      IF sink.procs.endOf[sink] THEN EXIT;
      Process.Pause[Process.SecondsToTicks[dt]];
     ENDLOOP;
  };
  

WordsInServiceSampleProducer: PROC[sink: RealEvent.StreamHandle] =
  {timer: Timer.Handle = Timer.Create[];
   dt: CARDINAL = Real.FixC[samplingInterval];  -- seconds
   DO
      sink.procs.put[sink, NEW[RealEvent.Object ← [sampleValue: SafeStorage.NWordsAllocated[] - SafeStorage.NWordsReclaimed[],
                                                   time: timer.Read[].time]]];
      IF sink.procs.endOf[sink] THEN EXIT;
      Process.Pause[Process.SecondsToTicks[dt]];
     ENDLOOP;
  };
  

-- START HERE...Create performance plotters


	       [] ← Plotter.Create[label: "dataQuantaInServiceHistory",
                                   autoRepaint: TRUE,
	                           nEvents: nEvents,
				   eventSource: RealEvent.CreateTimerDrivenStream[interval: samplingInterval, sampler: QuantaISSampler]];
	       [] ← Plotter.Create[label: "wordsInServiceHistory",
                                   autoRepaint: TRUE,
	                           nEvents: nEvents,
				   eventSource: RealEvent.CreateTimerDrivenStream[interval: samplingInterval, sampler: WordsISSampler]];
	       [] ← Plotter.Create[label: "rcFinalizeCountHistory",
                                   autoRepaint: TRUE,
	                           nEvents: nEvents,
				   eventSource: RealEvent.CreateTimerDrivenStream[interval: samplingInterval, sampler: FinalizeCountSampler]];
	       [] ← Plotter.Create[label: "rcOverflowUsageHistory",
                                   autoRepaint: TRUE,
	                           nEvents: nEvents,
				   eventSource: RealEvent.CreateTimerDrivenStream[interval: samplingInterval, sampler: RCOverflowUsageSampler]];
	       [] ← Plotter.Create[label: "rcTableFullnessHistory",
                                   autoRepaint: TRUE,
	                           nEvents: nEvents,
				   eventSource: RealEvent.CreateTimerDrivenStream[interval: samplingInterval, sampler: RCTableFullnessSampler]];
	       [] ← Plotter.Create[label: "allocTrapsPerSecHistory",
                                   autoRepaint: TRUE,
	                           nEvents: nEvents,
                                   plotValueDifferences: TRUE,
                                   plotValuePerSecond: TRUE,
				   eventSource: RealEvent.CreateTimerDrivenStream[interval: samplingInterval, sampler: AllocTrapsSampler]];
	       [] ← Plotter.Create[label: "rcOpsPerSecHistory",
                                   autoRepaint: TRUE,
	                           nEvents: nEvents,
                                   plotValueDifferences: TRUE,
                                   plotValuePerSecond: TRUE,
				   eventSource: RealEvent.CreateTimerDrivenStream[interval: samplingInterval, sampler: RCOpsSampler]];

	       IF testingCoForkStuff
	       THEN
	         { eventSink: RealEvent.StreamHandle;
                   [] ← Plotter.Create[label: "portPageFaultsPerSecHistory",
                                       autoRepaint: TRUE,
	                               nEvents: nEvents,
                                       plotValueDifferences: TRUE,
                                       plotValuePerSecond: TRUE,
				       eventSource: RefAnyStream.CreateCoForkedProducerStream[producer: PageFaultSampleProducer, data: NIL]];

	           [, eventSink] ← Plotter.CoCreate[label: "portWordsInServiceHistory",
                                                    autoRepaint: TRUE,
	                                            nEvents: nEvents];
	           Process.Detach[FORK WordsInServiceSampleProducer[eventSink]]};
END.