// stats.h 
//	Data structures for gathering statistics about Nachos performance.
//
// DO NOT CHANGE -- these stats are maintained by the machine emulation
//
//
// Copyright (c) 1992-1993 The Regents of the University of California.
// All rights reserved.  See copyright.h for copyright notice and limitation 
// of liability and disclaimer of warranty provisions.

#ifndef STATS_H
#define STATS_H

#include "copyright.h"

// The following class defines the statistics that are to be kept
// about Nachos behavior -- how much time (ticks) elapsed, how
// many user instructions executed, etc.
//
// The fields in this class are public to make it easier to update.

class Statistics {
  public:
    int totalTicks;      	// Total time running Nachos
    int idleTicks;       	// Time spent idle (no threads to run)
    int systemTicks;	 	// Time spent executing system code
    int userTicks;       	// Time spent executing user code
				// (this is also equal to # of
				// user instructions executed)

    int numDiskReads;		// number of disk read requests
    int numDiskWrites;		// number of disk write requests
    int numConsoleCharsRead;	// number of characters read from the keyboard
    int numConsoleCharsWritten; // number of characters written to the display
    int numPageFaults;		// number of virtual memory page faults
    int numPacketsSent;		// number of packets sent over the network
    int numPacketsRecvd;	// number of packets received over the network

    Statistics(); 		// initialize everything to zero

    void Print();		// print collected statistics
};

// Constants used to reflect the relative time an operation would
// take in a real system.  A "tick" is a just a unit of time -- if you 
// like, a microsecond.
//
// Since Nachos kernel code is directly executed, and the time spent
// in the kernel measured by the number of calls to enable interrupts,
// these time constants are none too exact.

const int UserTick = 	   1;	// advance for each user-level instruction 
const int SystemTick =	  10; 	// advance each time interrupts are enabled
const int RotationTime = 500; 	// time disk takes to rotate one sector
const int SeekTime =	 500;  	// time disk takes to seek past one track
const int ConsoleTime =	 100;	// time to read or write one character
const int NetworkTime =	 100;  	// time to send or receive one packet
const int TimerTicks = 	 100;  	// (average) time between timer interrupts

#endif // STATS_H
