DIRECTORY BasicTime USING [GMT, Now, Period], Cpa, PrincOpsUtils USING [LongZero], VM USING [PagesForWords, AddressForPageNumber, Interval, Pin, SimpleAllocate]; CpaImpl: CEDAR MONITOR IMPORTS BasicTime, PrincOpsUtils, VM, Cpa = BEGIN cpaSpace: LONG POINTER TO Cpa.CpaRecord _ NIL; cpaOn: BOOL _ FALSE; beginCpa: BasicTime.GMT; stopCpa: BasicTime.GMT; CpaOn: ENTRY PROC = { IF cpaOn THEN RETURN; IF cpaSpace = NIL THEN { nPages: INT = VM.PagesForWords[SIZE[Cpa.CpaRecord]]; interval: VM.Interval = VM.SimpleAllocate[nPages]; VM.Pin[interval]; cpaSpace _ LOOPHOLE[VM.AddressForPageNumber[interval.page]]; }; TRUSTED { PrincOpsUtils.LongZero[LOOPHOLE[cpaSpace], SIZE[Cpa.CpaRecord]] }; Cpa.CPA[cpaSpace]; beginCpa _ BasicTime.Now[]; cpaOn _ TRUE; }; CpaOff: ENTRY PROC = { IF ~cpaOn THEN RETURN; Cpa.CPA[NIL]; stopCpa _ BasicTime.Now[]; cpaOn _ FALSE; }; Time: ENTRY PROC RETURNS[INT] = { IF cpaOn THEN { Cpa.CPA[NIL]; -- turn off stopCpa _ BasicTime.Now[]; cpaOn _ FALSE; }; RETURN[BasicTime.Period[beginCpa, stopCpa]]; }; ECalls: ENTRY PROC RETURNS[LONG CARDINAL] = TRUSTED { n: LONG CARDINAL _ 0; ptr: LONG POINTER TO LONG CARDINAL _ @cpaSpace.efc0; IF cpaSpace = NIL THEN RETURN[0]; IF cpaOn THEN { Cpa.CPA[NIL]; -- turn off stopCpa _ BasicTime.Now[]; cpaOn _ FALSE; }; FOR i: INT IN [0..21B) DO n _ n + ptr^; ptr _ ptr+SIZE[LONG CARDINAL]; ENDLOOP; RETURN[n]; }; LCalls: ENTRY PROC RETURNS[LONG CARDINAL] = TRUSTED { n: LONG CARDINAL _ 0; ptr: LONG POINTER TO LONG CARDINAL _ @cpaSpace.lfc1; IF cpaSpace = NIL THEN RETURN[0]; IF cpaOn THEN { Cpa.CPA[NIL]; -- turn off stopCpa _ BasicTime.Now[]; cpaOn _ FALSE; }; FOR i: INT IN [0..21B) DO n _ n + ptr^; ptr _ ptr+SIZE[LONG CARDINAL]; ENDLOOP; RETURN[n]; }; AllCalls: PROC RETURNS[LONG CARDINAL] = TRUSTED { IF cpaSpace = NIL THEN RETURN[0]; RETURN[ECalls[] + LCalls[] + cpaSpace.sfc + cpaSpace.kfcb] }; END. €CpaImpl.mesa Copyright c 1986 by Xerox Corporation. All rights reserved. Willie-Sue, May 28, 1986 10:35:11 am PDT microcode statistics, for Dorados only ΚI˜šœ ™ Icodešœ Οmœ1™