// Uebung 9 zum Fach Betriebssysteme
// zu kompilieren mit: "gcc -Wall -lrt -lm -o Bs1ueb9 Bs1ueb9.c"
// Copyright Matthias Jauernig, 03IN
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <unistd.h>
#include <stdbool.h>
#include <time.h>
#include <math.h>

bool reset;
int i;

void sigtimerfkt(int signr){
	reset = true;
}

double x(double t){
	double a = 1e-8;  // Flankenabfallzeit
	double f = 1e7;   // Frequenz
	return (4 / (a*M_PI)*(sin(a)*sin(2*M_PI*f*t) + (1/9)*sin(3*a)*sin(2*M_PI*f*t)));
}

int main(void){
	int j, durchschnitt, durchns;
	struct itimerval itime;
	
	// Signalfunktionen setzen
	sigset(SIGALRM,   sigtimerfkt);
	sigset(SIGVTALRM, sigtimerfkt);
	
	// itime initialisieren
	timerclear(&itime.it_value);
	timerclear(&itime.it_interval);
	
	// ITIMER_REAL
	itime.it_value.tv_sec = 1;
	itime.it_interval.tv_sec = 1;
	setitimer(ITIMER_REAL, &itime, NULL);
	
	durchschnitt = 0;
	durchns = 0;
	printf("in ITIMER_REAL:\n");
	fflush(stdout);
	for(j=0; j<10; j++){
	        reset = false;
		for(i=0;; i++){ // Endlosschleife
			if(!reset)
				x(i*1e-17);
			else
				break;
		}
		printf("Zyklus %d: \t%d Durchlaeufe, \t%d Nanosekunden pro Durchlauf.\n",j+1,i,(int)1e9/i);
		fflush(stdout);
		durchns += (int)1e9/i;
		durchschnitt += i;
	}
	durchschnitt /= 10;
	durchns /= 10;
	printf("\nITIMER_REAL - Durchschnittliche Ausführungen von x(t) pro Sekunde: %d\n",durchschnitt);
	printf("ITIMER_REAL - Durchschnittliche Nanosekunden fuer x(t) benoetigt:  %d\n\n",durchns);
	// ITIMER_REAL inaktiv setzen
	itime.it_value.tv_sec = 0;
	setitimer(ITIMER_REAL, &itime, NULL);
	
	// ITIMER_VIRTUAL
	itime.it_value.tv_sec = 1;
	itime.it_interval.tv_sec = 1;
	setitimer(ITIMER_VIRTUAL, &itime, NULL);
	
	durchschnitt = 0;
	durchns = 0;
	printf("in ITIMER_VIRTUAL:\n");
	for(j=0; j<10; j++){
		reset = false;
		for(i=0;; i++){ // Endlosschleife
			if(!reset)
				x(i*1e-17);
			else
				break;
		}
		printf("Zyklus %d: \t%d Durchlaeufe, \t%d Nanosekunden pro Durchlauf.\n",j+1,i,(int)1e9/i);
		fflush(stdout);
		durchns += (int)1e9/i;
		durchschnitt += i;
	}
	durchschnitt /= 10;	
	durchns /= 10;
	printf("\nITIMER_VIRTUAL - Durchschnittliche Ausführungen von x(t) pro Sekunde: %d\n",durchschnitt);
	printf("ITIMER_VIRTUAL - Durchschnittliche Nanosekunden fuer x(t) benoetigt:  %d\n\n",durchns);
	// ITIMER_VIRTUAL inaktiv setzen
	itime.it_value.tv_sec = 0;
	setitimer(ITIMER_VIRTUAL, &itime, NULL);
	
	return 0;
}

