|
@@ -7,7 +7,25 @@
|
|
#include "error.h"
|
|
#include "error.h"
|
|
#include "sem.h"
|
|
#include "sem.h"
|
|
|
|
|
|
-boolean create_sem(semaphore* sem, int code, int nb) {
|
|
|
|
|
|
+/* --- Fonctions privées --- */
|
|
|
|
+/**
|
|
|
|
+ * Initialise les semaphores
|
|
|
|
+ * @param semaphore* Le tableau de semaphore
|
|
|
|
+ * @param int* Valeur à initialiser
|
|
|
|
+ * @return boolean Reussite
|
|
|
|
+ */
|
|
|
|
+boolean ini_sem(semaphore* sem, int* iniVal) {
|
|
|
|
+ /* Initialisation des valeurs */
|
|
|
|
+ if (semctl(sem->id, 0, SETALL, iniVal) == ERR) {
|
|
|
|
+ addperror("Impossible d'initialiser le tableau de semaphore");
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ /* Retour */
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* --- Fonctions publiques --- */
|
|
|
|
+boolean create_sem(semaphore* sem, int code, int nb, int* iniVal) {
|
|
int id;
|
|
int id;
|
|
extern int errno;
|
|
extern int errno;
|
|
/* Création du tableau */
|
|
/* Création du tableau */
|
|
@@ -16,8 +34,8 @@ boolean create_sem(semaphore* sem, int code, int nb) {
|
|
if (id == ERR) {
|
|
if (id == ERR) {
|
|
/* Si le tableau existe deja */
|
|
/* Si le tableau existe deja */
|
|
if (errno == EEXIST) {
|
|
if (errno == EEXIST) {
|
|
- adderror("Le tableau de sémaphore existe deja");
|
|
|
|
- return false;
|
|
|
|
|
|
+ adderror("Le tableau de sémaphore existe deja, tentaive de récupération");
|
|
|
|
+ return get_sem(sem, code);
|
|
}
|
|
}
|
|
/* Sinon erreur */
|
|
/* Sinon erreur */
|
|
addperror("Impossible de créer le tableau de sémaphore");
|
|
addperror("Impossible de créer le tableau de sémaphore");
|
|
@@ -27,8 +45,8 @@ boolean create_sem(semaphore* sem, int code, int nb) {
|
|
sem->id = id;
|
|
sem->id = id;
|
|
sem->key = key;
|
|
sem->key = key;
|
|
sem->nb = nb;
|
|
sem->nb = nb;
|
|
- /* Retour */
|
|
|
|
- return true;
|
|
|
|
|
|
+ /* Initialise semaphore */
|
|
|
|
+ return ini_sem(sem, iniVal);
|
|
}
|
|
}
|
|
|
|
|
|
boolean get_sem(semaphore* sem, int code) {
|
|
boolean get_sem(semaphore* sem, int code) {
|
|
@@ -55,16 +73,6 @@ boolean get_sem(semaphore* sem, int code) {
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
-boolean ini_sem(semaphore* sem, int* iniVal) {
|
|
|
|
- /* Initialisation des valeurs */
|
|
|
|
- if (semctl(sem->id, 0, SETALL, iniVal) == ERR) {
|
|
|
|
- addperror("Impossible d'initialiser le tableau de semaphore");
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
- /* Retour */
|
|
|
|
- return true;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
boolean P(semaphore* sem, int num) {
|
|
boolean P(semaphore* sem, int num) {
|
|
struct sembuf action;
|
|
struct sembuf action;
|
|
/* Le num valide */
|
|
/* Le num valide */
|