#include <semaphore.h>
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>


// Le processeur est deux fois plus rapide
// on divise donc cette valeur par deux

#define PROCESS 162500
#define PERIOD_SEC 1
#define PERIOD_NSEC 0
#define TH 333


// Variables globales de temps pour évaluer le bon déroulement du programme
int a = 0;
int b = 0;
int c = 0;
int temps = 0;

// Compte le nombre de tâches traitées
int aa = 0;
int bb = 0;
int cc = 0;


void do_work(unsigned int duration)
{
	int i;

	for(i=0; i<duration*PROCESS; i++)
	{
		asm volatile (" NOP"); // Le compilateur effectue un travail
	}
}

void t2(int i)
{
	a+= i/TH;
	temps += i;

	do_work(i);
	printf("Partition de travail T2 finie\n");

	if(a>=1)
	{
		printf("Travail T2 fini à t = %d secondes\n",temps/1000);
		a = 0;
		aa++;
	}
}

void t3(int i)
{
	b+= i/TH;
	temps += i;

	do_work(i);
	printf("Partition de travail T3 finie\n");

	if(b>=3)
	{
		printf("Travail T3 fini à t = %d secondes\n",temps/1000);
		b = 0;
		bb++;
	}
}

void t4(int i)
{
	c+= i/TH;
	temps += i;

	do_work(i);
	printf("Partition de travail T4 finie\n");

	if(c>=6)
	{
		printf("Travail T4 fini à t = %d secondes\n",temps/1000);
		c = 0;
		cc++;
	}
}



int main(void)
{
	// Voici la tâche principale qui doit appeler les fonctions t2, t3 et t4 tour à tour
	// Par facilité, on définit TH "third" pour un tiers de seconde

	// Ainsi
	// t2 nécessite TH toutes les deux secondes
	// t3 nécessite 3*TH toutes les trois secondes
	// t4 nécessite 6*TH toutes les quatre secondes

	int j=0;


	while (j<1)
	{
		t2(TH);// 333 millisecondes
		t3(TH*3);
		t4(TH*2);

		// 2 secondes écoulées

		t2(TH);
		t4(TH*2);

		// 3 secondes écoulées

		t3(TH);
		t4(TH*2);

		// 4 secondes écoulées

		t2(TH);
		t3(TH*2);

		// 5 secondes écoulées

		t4(TH*3);

		// 6 secondes écoulées

		t2(TH);
		t3(TH*2);

		// 7 secondes écoulées

		t4(TH*3);

		// 8 secondes écoulées

		t2(TH);
		t3(TH);
		t4(TH);

		// 9 secondes écoulées

		t3(TH*3);

		// 10 secondes écoulées

		t2(TH);
		t4(5*TH);

		// 12 secondes écoulées

		printf("%d taches T2, %d taches T3 et %d taches T4 traitees en un total de %d secondes\n",aa,bb,cc,temps/1000);

	j++;

	}



}
