104 lines
2.2 KiB
C
104 lines
2.2 KiB
C
/*
|
|
* Implementation d'un sémaphore de comptage par moniteurs
|
|
* bibliothèque pthread
|
|
* moniteurs = semaphores binaires (mutex) + conditions
|
|
*/
|
|
|
|
#include <pthread.h>
|
|
#include <stdio.h>
|
|
#include <unistd.h>
|
|
#include <stdlib.h>
|
|
#include "tprintf.h"
|
|
#include "macros-thread.h"
|
|
#include "semaphore-moniteur.h"
|
|
|
|
|
|
/* Définition du moniteur */
|
|
/* ---------------------- */
|
|
|
|
|
|
/* Points d'entrée */
|
|
/* Fonctions du moniteur */
|
|
/* seulement 2 fonctions en exclusion mutuelle : P_semaphore() et V_semaphore() */
|
|
/* Attention, les autres fonction sne sont pas protegees */
|
|
|
|
|
|
void init_semaphore(type_semaphore * sem, int val){
|
|
|
|
/* implementer l'initialisation de tous les champs
|
|
de l'enregistrement type-semaphore: mutex, attenteFifo, nbAttente, value
|
|
utiliser INIT_MUTEX, et INIT_COND
|
|
*/
|
|
INIT_MUTEX(sem->mutex);
|
|
INIT_COND(sem->attenteFifo);
|
|
sem->nbAttente=0;
|
|
sem->value=val;
|
|
return;
|
|
}
|
|
|
|
|
|
void P_semaphore(type_semaphore * sem){
|
|
|
|
/* implementer l'operateur semaphore P(sem) en exclusion mutuelle
|
|
modifie les champs de l'enregistrement type-semaphore: nbAttente, value
|
|
utiliser P_MUTEX, V_MUTEX et WAIT_COND
|
|
*/
|
|
P_MUTEX(sem->mutex);
|
|
sem->value--;
|
|
if ( sem->value < 0 ) {
|
|
sem->nbAttente++;
|
|
WAIT_COND(sem->attenteFifo,sem->mutex);
|
|
sem->nbAttente--;
|
|
}
|
|
V_MUTEX(sem->mutex);
|
|
return;
|
|
}
|
|
|
|
|
|
void V_semaphore(type_semaphore * sem){
|
|
|
|
/* implementer l'operateur semaphore V(sem) en exclusion mutuelle
|
|
modifie les champs de l'enregistrement type-semaphore: value
|
|
utiliser P_MUTEX, V_MUTEX et SIGNAL_COND
|
|
*/
|
|
P_MUTEX(sem->mutex);
|
|
sem->value++;
|
|
if ( sem->value <= 0 ) {
|
|
SIGNAL_COND(sem->attenteFifo);
|
|
}
|
|
V_MUTEX(sem->mutex);
|
|
return;
|
|
}
|
|
|
|
|
|
void destroy_semaphore(type_semaphore * sem){
|
|
|
|
/* implementer la destruction du semaphore
|
|
modifie les champs de l'enregistrement type-semaphore: nbAttente, value
|
|
*/
|
|
DESTROY_MUTEX(sem->mutex);
|
|
DESTROY_COND(sem->attenteFifo);
|
|
sem->nbAttente=0;
|
|
sem->value=0;
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
int value_semaphore(type_semaphore * sem){
|
|
|
|
/* implementer la lecture non protegee de la valeur du semaphore: champs value */
|
|
|
|
return sem->value;
|
|
}
|
|
|
|
|
|
int estVideFifo_semaphore(type_semaphore * sem){
|
|
|
|
/* implementer l'acces au nombre de processus en attente en liste Fifo semaphore: champs nbAttente */
|
|
|
|
return sem->nbAttente==0;
|
|
}
|
|
|
|
|