# Projet_Q4_Groupe_O4

## Description des fichiers :

@fonctions.h
Un fichier header qui reprend les structures utilisées pour les listes chaînées ainsi que les nom 
des fonctions utilisées dans fonctions.c

@fonctions.c
Un fichier avec l'implémentation des différentes fonctions décrites dans le fichier header.
Dans celui-ci, il y a les fonctions liées aux listes chaînées, une fonction pour trouver les 
diviseurspremiers d'un nombre donné, une fonction comptant les listes d'un fichier et des fonctions 
pour initialiser les 2 buffers.

@main.c
Le code source à compiler pour obtenir le programme

@test.c
Un fichier reprenant les tests unitaires de nos fonctions

@Makefile
Le fichier reprenant les commandes à executer pour lancer le code de façon plus agréable

## Lancer le code :

- make fact               : produit l'exécutable "fact"

- make cpp / make cpp_xml : compile le programme et analyse ou donne le rapport d'analyse avec cppcheck

- make val / make val_xml : compile le programme et analyse ou donne le rapport d'analyse avec valgrind

- make test               : compile le programme et exécute les test unitaires

- make clean              : nettoie le dossier et supprime les exécutables créés

- ./fact -N nthreads input.txt output.txt : lance le programme exécutable fact
	* nthreads   : le nombre de threads du programme, un entier >= 1
	* input.txt  : le nom du fichier input ayant des lignes d'entiers compris entre 2 et 2^(31)-1
	* output.txt : le nom du fichier output qui est créé si il n'existe pas encore

- ./test : lance le programme exécutable test

## Architecture du code :

Notre code est découpé en 3 parties : 

1) Lecture  (1 thread ) : lit les lignes du fichier input et en stock les entiers dans le buffer_1

2) Calcul   (n threads) : prend les entiers du buffer_1, calcul la liste des diviseurs premiers de l'entier
			  et stock cette liste d'entiers dans le buffer_2
3) Ecriture (1 thread ) : prend les listes d'entiers du buffer_2 et les écrit dans le fichier output

   Les 2 buffers sont protégés par 1 mutex et 2 sémaphores (free et full) chacun

## Bon fonctionnement :

Pour un bon fonctionnement du code, il faut respecter quelque règles :

1) Le fichier input doit être composé de lignes ne comportant que des entiers compris entre 2 et 2^(31)-1
   avec un seul entier par ligne

2) Le nombre de thread(s) doit être précisé et doit être >= 1

3) Pour un bon fonctionnement de valgrind, il faut que le fichier "example_input.txt" soit dans le même dossier
   que le Makefile

# Projet_Q4_Groupe_O4