Skip to content
Extraits de code Groupes Projets
Valider 1da66f96 rédigé par Laurent Paucot's avatar Laurent Paucot
Parcourir les fichiers

quelques fix

parent d0561bcf
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
Pipeline #3999 réussi
......@@ -8,7 +8,7 @@
#include <pthread.h>
#include <semaphore.h>
#define N 4
//travailler avec des linkendList
typedef struct node{
long value;
......@@ -21,7 +21,7 @@ typedef struct queue{
}queue_t;
struct buffer_rc{
char *tab[8];
char *tab[2*N];
int size;
int len;
int head;
......@@ -33,7 +33,7 @@ struct buffer_rc{
struct buffer_cw
{
queue_t *tab[8];
queue_t *tab[2*N];
int size;
int len;
int head;
......@@ -60,11 +60,11 @@ sem_t empty2;
sem_t full2;
void put_in_buffer_1(char **c, struct buffer_rc *ptr){ //ajouter un element dans le buffer 1
void put_in_buffer_1(char *c, struct buffer_rc *ptr){ //ajouter un element dans le buffer 1
//buffer_1.tab[buffer_1.head] = malloc(sizeof(c)); // on stoxke de espace
//ptr->tab[ptr->head] = *c;
strcpy(ptr->tab[ptr->head],*c); //copie
//ptr->tab[ptr->head] = malloc(sizeof(c)); // on stoxke de espace
ptr->tab[ptr->head] = c;
//strcpy(ptr->tab[ptr->head],c); //copie
ptr->len++; // augmente l'espace occupé par le buffer
ptr->head = (ptr->head + 1)%ptr->size; //chaque fois qu'un élément est ajouté,
//on augmente le pointeur de 1 mais l'espace du buffer est de 8 donc faire un modulo
......@@ -74,7 +74,8 @@ void put_in_buffer_1(char **c, struct buffer_rc *ptr){ //ajouter un element dans
char *get_from_buffer_1(struct buffer_rc *ptr){ // chercher dans le buffer 1
char *result;
result = ptr->tab[ptr->tail]; // donne un valeur a result
//buffer_1.tab[buffer_1.tail] = NULL;
//free(*ptr->tab[ptr->tail]);
ptr->tab[ptr->tail] = NULL;
ptr->len--; //diminue l'espace occupé par le buffer
ptr->tail = (ptr->tail + 1)%ptr->size;
......@@ -174,8 +175,8 @@ void *writing(void *param){
struct buffer_cw *param1 = (struct buffer_cw *) param;
while(param1->stop < 4 || param1->len > 0){
while(param1->stop < N || param1->len > 0){
pthread_mutex_unlock(&mutex2);
sem_wait(&full2);
pthread_mutex_lock(&mutex2);
queue_t *pr_divs = get_from_buffer_2(param);
......@@ -199,7 +200,10 @@ void *writing(void *param){
}
fputc('\n',file2);
pthread_mutex_lock(&mutex2);
}
pthread_mutex_unlock(&mutex2);
return NULL;
}
......@@ -212,6 +216,7 @@ void *calculating(void *param){
while(buffer_1->stop == 0 || buffer_1->len > 0){
pthread_mutex_unlock(&mutex1);
sem_wait(&full1);
pthread_mutex_lock(&mutex1);
char *chaine = get_from_buffer_1(buffer_1);
......@@ -230,10 +235,14 @@ void *calculating(void *param){
pthread_mutex_unlock(&mutex2);
sem_post(&full2);
pthread_mutex_lock(&mutex1);
}
}
pthread_mutex_unlock(&mutex1);
pthread_mutex_lock(&mutex2);
buffer_2->stop ++;
pthread_mutex_unlock(&mutex2);
return NULL;
}
......@@ -249,15 +258,11 @@ void *reading (void *param){
while (fgets(chaine,20,input) != NULL){
char **ptr;
ptr = malloc(sizeof(chaine));
*ptr = chaine;
sem_wait(&empty1);
pthread_mutex_lock(&mutex1);
put_in_buffer_1(ptr,param1); //put each line in the buffer #1
put_in_buffer_1(chaine,param1); //put each line in the buffer #1
pthread_mutex_unlock(&mutex1);
sem_post(&full1);
......@@ -299,12 +304,12 @@ int run (char *input,char *output){
struct buffer_rc buffer_1;
//*buffer_1.tab = malloc(sizeof(char[8]));
for (int i = 0; i < 8; i++)
for (int i = 0; i < 2*N; i++)
{
buffer_1.tab[i] = malloc(sizeof(char*));
}
buffer_1.size = 8;
buffer_1.size = 2*N;
buffer_1.len = 0;
buffer_1.head = 0;
buffer_1.tail = 0;
......@@ -323,7 +328,7 @@ int run (char *input,char *output){
struct buffer_cw buffer_2;
buffer_2.size = 8;
buffer_2.size = 2*N;
buffer_2.len = 0;
buffer_2.head = 0;
buffer_2.tail = 0;
......@@ -332,7 +337,9 @@ int run (char *input,char *output){
struct buffer_cw *ptr2;
ptr2 = malloc(sizeof(struct buffer_cw));
if (ptr2 == NULL){return -1;}
if (ptr2 == NULL){
free(ptr1);
return -1;}
*ptr2 = buffer_2;
......@@ -350,7 +357,7 @@ int run (char *input,char *output){
pthread_t reader;
pthread_t calculators[4];
pthread_t calculators[N];
pthread_t writer;
sem_1_initializer(ptr1);
......@@ -358,14 +365,14 @@ int run (char *input,char *output){
pthread_create(&reader,NULL,&reading,ptr1);
for (int i = 0; i < 4; i++)
for (int i = 0; i < N; i++)
{
pthread_create(&calculators[i],NULL,&calculating,ptr3);
}
pthread_create(&writer,NULL,&writing,ptr2);
pthread_join(reader,NULL);
for (int i = 0; i < 4; i++)
for (int i = 0; i < N; i++)
{
pthread_join(calculators[i],NULL);
}
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter