Diff for /rpl/src/semaphores.c between versions 1.5 and 1.6

version 1.5, 2010/07/14 14:19:40 version 1.6, 2010/08/06 15:26:51
Line 20 Line 20
 */  */
   
   
 #ifdef SEMAPHORES_NOMMES  #include "rpl-conv.h"
 #include "rpl.conv.h"  
   
   #ifdef SEMAPHORES_NOMMES
   
 /*  /*
 ================================================================================  ================================================================================
Line 105  sem_getvalue2(sem_t *semaphore, int *val Line 105  sem_getvalue2(sem_t *semaphore, int *val
     return(0);      return(0);
 }  }
   
   #endif
   
   #ifdef OS2
   
   /*
   ================================================================================
     Fonctions d'émulation de sémaphores POSIX en fonction des sémaphores SysV
   ================================================================================
     Entrées :
   --------------------------------------------------------------------------------
     Sorties :
   --------------------------------------------------------------------------------
     Effets de bord : néant
   ================================================================================
   */
   
   extern unsigned char *chemin_semaphores_SysV;
   
   int
   sem_init(sem_t *semaphore, int shared, unsigned int valeur)
   {
       union semun     argument;
   
       if (shared != 0)
       {
           return(ENOSYS);
       }
   
       (*semaphore) = semget(IPC_PRIVATE, 1, IPC_CREAT | IPC_EXCL | SEM_R | SEM_A);
   
       if ((*semaphore) == -1)
       {
           return(EINVAL);
       }
   
       argument.val = valeur;
       semctl((*semaphore), 0, SETVAL, argument);
   
       return(0);
   }
   
   int
   sem_destroy(sem_t *semaphore)
   {
       if (semctl((*semaphore), IPC_RMID, 0) == -1)
       {
           return(EINVAL);
       }
   
       return(0);
   }
   
   int
   sem_wait(sem_t *semaphore)
   {
       struct sembuf       commande;
   
       commande.sem_num = 0;
       commande.sem_op = -1;
       commande.sem_flg = 0;
   
       if (semop((*semaphore), &commande, 1) == -1)
       {
           return(EINVAL);
       }
   
       return(0);
   }
   
   int
   sem_trywait(sem_t *semaphore)
   {
       struct sembuf       commande;
   
       commande.sem_num = 0;
       commande.sem_op = -1;
       commande.sem_flg = IPC_NOWAIT;
   
       if (semop((*semaphore), &commande, 1) == -1)
       {
           if (errno == EAGAIN)
           {
               return(EAGAIN);
           }
   
           return(EINVAL);
       }
   
       return(0);
   }
   
   int
   sem_post(sem_t *semaphore)
   {
       struct sembuf       commande;
   
       commande.sem_num = 0;
       commande.sem_op = 1;
       commande.sem_flg = 0;
   
       if (semop((*semaphore), &commande, 1) == -1)
       {
           return(EINVAL);
       }
   
       return(0);
   }
   
   int
   sem_getvalue(sem_t *semaphore, int *valeur)
   {
       (*valeur) = semctl((*semaphore), 0, GETVAL);
   
       if ((*valeur) < 0)
       {
           return(EINVAL);
       }
   
       return(0);
   }
   
   sem_t
   *sem_open(const char *nom, int oflag, ...)
   //*sem_open(const char *nom, int oflag)
   //*sem_open(const char *nom, int oflag, mode_t mode, unsigned int value)
   {
       mode_t              mode;
   
       sem_t               *semaphore;
   
       union semun         argument;
   
       unsigned char       *nom_absolu;
   
       unsigned int        valeur;
   
       va_list             liste;
   
       if ((nom_absolu = malloc((strlen(chemin_semaphores_SysV) + strlen(nom)
               + 1) * sizeof(unsigned char))) == NULL)
       {
           return(SEM_FAILED);
       }
   
       sprintf(nom_absolu, "%s%s", chemin_semaphores_SysV, nom);
   
       if ((semaphore = malloc(sizeof(sem_t))) == NULL)
       {
           return(SEM_FAILED);
       }
   
       if ((oflag & O_CREAT) == 0)
       {
           // 2 arguments
           (*semaphore) = semget(ftok(nom_absolu, 1), 0, 0);
   
           if ((*semaphore) == -1)
           {   
               free(semaphore);
               free(nom_absolu);
   
               return(SEM_FAILED);
           }
       }
       else
       {
           // 4 arguments
   
           // O_CREAT O_EXCL
           // S_IRUSR S_IWUSR
   
           va_start(liste, oflag);
           mode = va_arg(liste, mode_t);
           valeur = va_arg(liste, unsigned int);
           va_end(liste);
   
           (*semaphore) = semget(ftok(nom_absolu, 1), 1,
                   ((oflag & O_CREAT) == 0) ? 0 : IPC_CREAT |
                   ((oflag & O_EXCL) == 0) ? 0 : IPC_EXCL |
                   ((oflag & S_IRUSR) == 0) ? 0 : SEM_R |
                   ((oflag & S_IWUSR) == 0) ? 0 : SEM_A);
   
           if ((*semaphore) == -1)
           {   
               free(semaphore);
               free(nom_absolu);
   
               return(SEM_FAILED);
           }
   
           argument.val = valeur;
           semctl((*semaphore), 0, SETVAL, argument);
       }
   
       free(nom_absolu);
   
       return(SEM_FAILED);
   }
   
   int
   sem_close(sem_t *semaphore)
   {
       free(semaphore);
       return(0);
   }
   
   int
   sem_unlink(const char *nom)
   {
       sem_t               semaphore;
   
       struct sembuf       commande;
   
       unsigned char       *nom_absolu;
   
       if ((nom_absolu = malloc((strlen(chemin_semaphores_SysV) + strlen(nom)
               + 1) * sizeof(unsigned char))) == NULL)
       {
           return(ENOMEM);
       }
   
       sprintf(nom_absolu, "%s%s", chemin_semaphores_SysV, nom);
   
       if ((semaphore = semget(ftok(nom_absolu, 1), 0, 0)) == -1)
       {   
           free(nom_absolu);
           return(EINVAL);
       }
   
       commande.sem_num = 0;
       commande.sem_op = 0;
       commande.sem_flg = 0;
   
       if (semop(semaphore, &commande, 1) == -1)
       {
           free(nom_absolu);
           return(EINVAL);
       }
   
       if (semctl(semaphore, IPC_RMID, 0) == -1)
       {
           free(nom_absolu);
           return(EINVAL);
       }
   
       if (unlink(nom_absolu) == -1)
       {
           free(nom_absolu);
           return(EACCES);
       }
   
       free(nom_absolu);
   
       return(0);
   }
   
 #endif  #endif
   
 // vim: ts=4  // vim: ts=4

Removed from v.1.5  
changed lines
  Added in v.1.6


CVSweb interface <joel.bertrand@systella.fr>