(* ----------------------------------------------------------------------------
 * $Id: SYSINFO.mi,v 1.1 1994/11/28 20:32:53 dolzmann Exp $
 * ----------------------------------------------------------------------------
 * Copyright (c) 1994 Universitaet Passau
 * ----------------------------------------------------------------------------
 * This file is part of MAS.
 * ----------------------------------------------------------------------------
 * $Log: SYSINFO.mi,v $
 * Revision 1.1  1994/11/28  20:32:53  dolzmann
 * New modules SYSINFO.md, SYSINFO.mi, LISTTOOLS.md, and LISTTOOLS.mi.
 * Makefile adapted.
 *
 * ----------------------------------------------------------------------------
 *)

IMPLEMENTATION MODULE SYSINFO;
(* System Informations Implementation Module. *)

(******************************************************************************
*		    S Y S T E M   I N F O R M A T I O N	S	      	      *
*-----------------------------------------------------------------------------*
* Author:   Andreas Dolzmann                                                  *
* Language: Modula II                                                         *
* System:   This program is written for the computer algebra system MAS by    *
*           Heinz Kredel.                                                     *
* Remark:   Only mas kernel algorithms are used.                              *
*           The computation of the number of used cells is time expensive.    *
*           So the number of used cells is not reported normally.             *
* Abstract: This module implements procedures for system resource statistics. *
*           It uses the type SYSINFO to store the information over the        *
*           resources. It is possible to record statistical dates on one      *
*           time and print theses data later.                                 *
******************************************************************************)

FROM MASBIOS	IMPORT	BLINES, SWRITE;
FROM MASELEM	IMPORT	GAMMAINT;
FROM MASSTOR	IMPORT	CELLS, GCC, GCCC, NU, TAU, TIME;
FROM SACLIST	IMPORT	AWRITE; 

CONST rcsidi = "$Id: SYSINFO.mi,v 1.1 1994/11/28 20:32:53 dolzmann Exp $";
CONST copyrighti = "Copyright (c) 1994 Universitaet Passau";

PROCEDURE SysInfoStart(VAR s:SYSINFO);
(* system information start. The variable s needs no initialization.
All data in s are lost.
Informations over the usage of system resources are stored. 
Use this procedure to start the recording of statistical data over system 
resource usage. *)
BEGIN
	WITH s DO
		Time:=TIME();
		GarbageCollections:=GCC;
		ReclaimedCells:=GCCC;
		IF Cells THEN UsedCells:=CELLS(); END;
		GarbageCollectionTime:=TAU;
	END;
END SysInfoStart;

PROCEDURE SysInfoStop(VAR s:SYSINFO);
(* system information stop. The variable s contains informations over system
resources. The usage of this resources between the time of the initialization 
of s and now are stored in s.
Use this procedure to stop the recording of statistical data over system 
resource usage. *)
BEGIN
	WITH s DO
		Time:=TIME()-Time;
		GarbageCollections:=GCC-GarbageCollections;
		ReclaimedCells:=GCCC-ReclaimedCells;
		IF Cells THEN UsedCells:=CELLS()-UsedCells; END;
		GarbageCollectionTime:=TAU-GarbageCollectionTime;
	END;
END SysInfoStop;

PROCEDURE SysInfoSum(a,b:SYSINFO; VAR s:SYSINFO);
(* system information sum. The variable s needs no initialization.
The sum of all data in a and b are stored in s. 
Use this procedure to join statistical data of two registration period. *)
BEGIN
	WITH s DO
		Time:=a.Time+b.Time;
		GarbageCollections:=a.GarbageCollections+b.GarbageCollections;
		ReclaimedCells:=a.ReclaimedCells+b.ReclaimedCells;
		IF Cells THEN UsedCells:=a.UsedCells+b.UsedCells END;
		GarbageCollectionTime:=a.GarbageCollectionTime+
						b.GarbageCollectionTime;
	END;
END SysInfoSum;

PROCEDURE SysInfoWrite(s: SYSINFO);
(* system information write. The variable s contains informations over system
resources. All informations in s are written out. 
Use this procedure to write out the statistical data of a registration *)
BEGIN
	WITH s DO
		SWRITE("SysInfo: Time: ");
		AWRITE(Time);
		IF GarbageCollections>0 THEN 
			SWRITE(" ms plus ");
			AWRITE(GarbageCollectionTime);
			SWRITE(" ms garbage collection time. ");
		ELSE
			SWRITE(" ms.");
		END;
		BLINES(0);
		IF Cells THEN
			SWRITE("         "); 
			SWRITE("Cells: ");
			AWRITE(UsedCells);
			SWRITE(" cells used of "); 
			AWRITE(NU);
			SWRITE(" cells.");
			BLINES(0);
		END;
		IF GarbageCollections>0 THEN 
			SWRITE("         ");
			SWRITE("GC: ");
			AWRITE(ReclaimedCells);
			SWRITE(" cells reclaimed in ");
			AWRITE(GarbageCollectionTime);
			SWRITE(" ms with ");
			AWRITE(GarbageCollections);
			IF GarbageCollections>1 THEN
				SWRITE(" gc's.");
			ELSE
				SWRITE(" gc.");
			END;
			BLINES(0);
		END;
	END;
END SysInfoWrite;

BEGIN
	Cells:=FALSE;
END SYSINFO.

(* -EOF- *)