/* * Implementation d'un sémaphore de comptage par moniteurs * bibliothèque pthread * moniteurs = semaphores binaires (mutex) + conditions */ #include #include #include #include #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; }