Newer
Older
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
//travailler avec des linkendList
typedef struct node{
struct node *tail;
int size;
}queue_t;
struct buffer_rc{
char *tab[8];
int size;
int len;
struct buffer_cw
{
queue_t *tab[8];
int size;
int len;
struct buffer_rccw{
struct buffer_rc *struct1;
struct buffer_cw *struct2;
};
/* sémaphore est une structure de donné qui contient :
*un entier qui stocke la valeur, positive ou nulle du sémaphore.
*une queue qui contient les pointeurs vers les threads
*/
pthread_mutex_t mutex1;
sem_t empty1;
sem_t full1;
pthread_mutex_t mutex2;
sem_t empty2;
sem_t full2;
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->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
char *get_from_buffer_1(struct buffer_rc *ptr){ // chercher dans le buffer 1
result = ptr->tab[ptr->tail]; // donne un valeur a result
//buffer_1.tab[buffer_1.tail] = NULL;
ptr->len--; //diminue l'espace occupé par le buffer
ptr->tail = (ptr->tail + 1)%ptr->size;
void put_in_buffer_2(struct queue *ptr, struct buffer_cw *buf){ //ajouter un element dans le buffer 2
buf->tab[buf->head] = ptr;
buf->len++; //augmenté l'espace occupé par le buffer
buf->head = (buf->head + 1)%buf->size;
queue_t *get_from_buffer_2(struct buffer_cw *buf){ // trouver un element
result = buf->tab[buf->tail]; //donne une valeur a result
buf->len--; //diminue l'espace occupé par le buffer
buf->tail = (buf->tail + 1)%buf->size;
int is_div(long number, long i) { // Vérifie si i est un diviseur de number.
return (number % i == 0) ; // revoi 0 si le nombre n'est pas divisible par i et 1 si il est divisible
}
int is_prime(long number) { // Vérifie si number est un nombre premier. Return 1 si il est premier, 0 sinon
if (number != 2) {
if (number % 2 == 0) {
return 0 ;
}
}
for (long i = 3 ; i <= (number/2); i = i + 2) { //regarde les differents nombres pouvant etre diviser number
if (is_div(number,i) != 0) { // si i peut diviser number
return 0 ; //renvoi 0 => FAUX
}
}
return 1 ; //sinon => VRAI
}
void enqueue(queue_t* q, long val){
ptr -> value = val;
ptr -> next = malloc(sizeof(node_t));
else{
*ptr->next = *q->tail->next;
*q->tail->next = *ptr;
}
q->size++;
new_queue.tail = malloc(sizeof(node_t));
if(new_queue.tail==NULL){return NULL;}
if (ptr == NULL){
free(new_queue.tail);
free(ptr);
return NULL;}
for (long i = 2; i <= number/2; i++){
if (is_div(number, i) && is_prime(i) == 1){
struct buffer_cw *param1 = (struct buffer_cw *) param;
//char *chaine = NULL; //juste pour que le code compile
*current = *pr_divs->tail;
current = current->next;
for (int i = 0; i < pr_divs->size; i++)
{
fprintf(file2," %ld",current->value);
current = current->next;
}
fputc('\n',file2);
struct buffer_rccw *param1 = (struct buffer_rccw *) param;
struct buffer_rc *buffer_1 = param1->struct1;
struct buffer_cw *buffer_2 = param1->struct2;
pr_divs = malloc(sizeof(queue_t));
if (pr_divs == NULL){return NULL;}
sem_wait(&empty2);
pthread_mutex_lock(&mutex2);
struct buffer_rc *param1= (struct buffer_rc *) param;
FILE *input;
//input = malloc(sizeof(FILE*));
input = param1->file1;
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
pthread_mutex_unlock(&mutex1);
sem_post(&full1);
}
}
void sem_2_initializer (struct buffer_cw *buf){
FILE *file1 = NULL;
FILE *file2 = NULL;
file1 = fopen(input,"r");
if (file1 == NULL){return -1;}
file2 = fopen(output,"w+");
if (file2 == NULL){
fclose(file1);
return -1;
}
struct buffer_rc buffer_1;
//*buffer_1.tab = malloc(sizeof(char[8]));
for (int i = 0; i < 8; i++)
{
buffer_1.tab[i] = malloc(sizeof(char*));
}
buffer_1.size = 8;
buffer_1.len = 0;
buffer_1.head = 0;
buffer_1.tail = 0;
buffer_1.file1 = file1;
struct buffer_rc *ptr1;
ptr1 = malloc(sizeof(struct buffer_rc));
if (ptr1 == NULL){
free(buffer_1.file1);
free(ptr1);
return -1;}
*ptr1 = buffer_1;
struct buffer_cw buffer_2;
buffer_2.size = 8;
buffer_2.len = 0;
buffer_2.head = 0;
buffer_2.tail = 0;
struct buffer_cw *ptr2;
ptr2 = malloc(sizeof(struct buffer_cw));
if (ptr2 == NULL){return -1;}
*ptr2 = buffer_2;
struct buffer_rccw buffer_12;
buffer_12.struct1 = ptr1;
buffer_12.struct2 = ptr2;
struct buffer_rccw *ptr3;
ptr3 = malloc(sizeof(struct buffer_rccw));
if (ptr3 == NULL){return -1;}
*ptr3 = buffer_12;
pthread_t reader;
pthread_t calculators[4];
pthread_t writer;
sem_1_initializer(ptr1);
sem_2_initializer(ptr2);
pthread_create(&calculators[i],NULL,&calculating,ptr3);
pthread_join(reader,NULL);
for (int i = 0; i < 4; i++)
{
pthread_join(calculators[i],NULL);
}
pthread_join(writer,NULL);
/* int main() {
int err = run("input.txt", "actual_output.txt");