Ver Fonte

Modifcation fonctionnement semaphore

Loquicom há 6 anos atrás
pai
commit
b55b27a6cc
2 ficheiros alterados com 25 adições e 24 exclusões
  1. 23 15
      sem.c
  2. 2 9
      sem.h

+ 23 - 15
sem.c

@@ -7,7 +7,25 @@
 #include "error.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;
     extern int errno;
     /* Création du tableau */
@@ -16,8 +34,8 @@ boolean create_sem(semaphore* sem, int code, int nb) {
     if (id == ERR) {
         /* Si le tableau existe deja */
         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 */
         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->key = key;
     sem->nb = nb;
-    /* Retour */
-    return true;
+    /* Initialise semaphore */
+    return ini_sem(sem, iniVal);
 }
 
 boolean get_sem(semaphore* sem, int code) {
@@ -55,16 +73,6 @@ boolean get_sem(semaphore* sem, int code) {
     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) {
     struct sembuf action;
     /* Le num valide */

+ 2 - 9
sem.h

@@ -20,9 +20,10 @@ typedef struct{
  * @param semaphore* Le tableau de semaphore
  * @param int La clef
  * @param int Le nombre semaphores
+ * @param int* Valeur à initialiser
  * @return boolean Reussite
  */
-boolean create_sem(semaphore*, int, int);
+boolean create_sem(semaphore*, int, int, int*);
 
 /**
  * Récuperation d'un tableau de semaphores
@@ -32,14 +33,6 @@ boolean create_sem(semaphore*, int, int);
  */
 boolean get_sem(semaphore*, int);
 
-/**
- * Initialise les semaphores
- * @param semaphore* Le tableau de semaphore
- * @param int* Valeur à initialiser
- * @return boolean Reussite
- */
-boolean ini_sem(semaphore*, int*);
-
 /**
  * Demande l'acces et decremente le semaphore (Puis je)
  * @param semaphore* Le tableau de semaphore