// Ameliorations des rafales 

// L'ancienne méthode effectue le traitement de la fonction du signal en parallèle
// Ici, on exécute ce traitement dans le programme principal

// En revanche, si réception d'un signal pendant traitement  => erreur


#include <semaphore.h>
#include <pthread.h>
#include <iostream>
#include <unistd.h>
#include <signal.h>
using namespace std;

#define PROCESS 325000

int stack = 0;
// Utiliser une seule variable globale ne suffit pas, car l'incrémentation et la décrémentation peuvent se faire
// de façon désinchronisée

// Ainsi nous utilisons une autre variable globale, dédiée à la décrémentation

int stack2 = 0;


void do_work(unsigned int duration);
void ecoute (int signo); // Signal handler

void do_work(unsigned int duration)
{
	int i;
	for(i=0; i<duration*PROCESS; i++)
	{
		asm volatile (" NOP"); // Le compilateur effectue un travail
	}	
	printf("Un travail est fini\n");
}

void ecoute (int signo)
{ 
	// printf("SIGUSR1 a ete recu\n"); 
	// do_work(500); // Ne doit plus se faire ici pour résoudre le problème
	stack++; 

}

int main(void)
{
		
	signal(SIGUSR1, ecoute); // Le signal handler est associé au signal SIGUSR1
	
	int i;
	
	// Rafale de signaux
	for(i=0; i<20; i++)
	{
		
		kill(getpid(),SIGUSR1);
		
		if (stack > stack2)
		{
			stack2++;
			do_work(1000);
			
		}
		
		else if (stack == stack2)
		{
			cout << "En attente";
		}
		
		else if (stack < stack2)
		{
			cout << "Trop d'interruptions";
		}
		
		cout << stack << " a traiter, " << stack2 << " traites\n";
	}
	
	
	
	return 0;
}