Diff for /rpl/src/semaphores.c between versions 1.38 and 1.39

version 1.38, 2011/09/21 10:33:40 version 1.39, 2011/10/10 10:58:12
Line 22 Line 22
   
 #include "rpl-conv.h"  #include "rpl-conv.h"
   
   
 #ifdef SEMAPHORES_NOMMES  #ifdef SEMAPHORES_NOMMES
   
 // Les fonctions suivantes ne sont utilisées que dans le cas d'un  // Les fonctions suivantes ne sont utilisées que dans le cas d'un
Line 334  sem_init_SysV(sem_t *semaphore, int shar Line 335  sem_init_SysV(sem_t *semaphore, int shar
   
         return(ios);          return(ios);
 #   else // OS/2  #   else // OS/2
           sem_t           *psem;
   
     sem_t           *psem;          psem = semaphore;
   
     psem = semaphore;  
   
     if (shared != 0)  
     {  
         errno = ENOSYS;  
         return(-1);  
     }  
   
     if (((*psem).cnt = malloc(sizeof(ULONG))) == NULL)  
     {  
         free(psem);  
         errno = ENOMEM;  
         return(-1);  
     }  
   
     if (((*psem).nopened = malloc(sizeof(ULONG))) == NULL)          if (((*psem).cnt = malloc(sizeof(ULONG))) == NULL)
     {          {
         free((*psem).cnt);              free(psem);
         free(psem);              errno = ENOMEM;
         errno = ENOMEM;              return(-1);
         return(-1);          }
     }  
   
     if (DosCreateMutexSem(NULL, &((*psem).hmtx), 0, 0) != 0)          if (((*psem).nopened = malloc(sizeof(ULONG))) == NULL)
     {          {
         free((*psem).cnt);              free((*psem).cnt);
         free((*psem).nopened);              free(psem);
         free(psem);              errno = ENOMEM;
         return(-1);              return(-1);
     }          }
   
     if (DosCreateEventSem(NULL, &((*psem).hev), 0, (valeur != 0) ? 1 : 0) != 0)          if (DosCreateMutexSem(NULL, &((*psem).hmtx), 0, 0) != 0)
     {          {
         DosCloseMutexSem((*psem).hmtx);              free((*psem).cnt);
         free((*psem).cnt);              free((*psem).nopened);
         free((*psem).nopened);              free(psem);
         free(psem);              return(-1);
         return(-1);          }
     }  
   
     (*(*psem).cnt) = valeur;          if (DosCreateEventSem(NULL, &((*psem).hev), 0, (valeur != 0) ? 1 : 0)
     (*(*psem).nopened) = 1;                  != 0)
     (*psem).shared = shared;          {
     (*psem).allocated = 0;              DosCloseMutexSem((*psem).hmtx);
               free((*psem).cnt);
               free((*psem).nopened);
               free(psem);
               return(-1);
           }
   
     return(0);          (*(*psem).cnt) = valeur;
           (*(*psem).nopened) = 1;
           (*psem).shared = shared;
           (*psem).allocated = 0;
   
           return(0);
 #   endif  #   endif
 }  }
   
Line 410  sem_destroy_SysV(sem_t *semaphore) Line 404  sem_destroy_SysV(sem_t *semaphore)
   
         return(0);          return(0);
 #   else // OS/2  #   else // OS/2
           sem_t       *psem;
   
     sem_t       *psem;          psem = semaphore;
   
     psem = semaphore;  
   
     if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0)          if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0)
     {          {
         return(EINVAL);              return(EINVAL);
     }          }
   
     if (DosCloseMutexSem((*psem).hmtx) != 0)          if (DosCloseMutexSem((*psem).hmtx) != 0)
     {          {
         return(EINVAL);              return(EINVAL);
     }          }
   
     while(DosCloseEventSem((*psem).hev) == ERROR_SEM_BUSY)          while(DosCloseEventSem((*psem).hev) == ERROR_SEM_BUSY)
     {          {
         DosPostEventSem((*psem).hev);              DosPostEventSem((*psem).hev);
     }          }
   
     (*(*psem).nopened)--;          (*(*psem).nopened)--;
   
     if ((*psem).shared == 0)          if ((*psem).shared == 0)
     {  
         free((*psem).cnt);  
         free((*psem).nopened);  
     }  
     else  
     {  
         if ((*(*psem).nopened) == 0)  
         {          {
             DosFreeMem((*psem).cnt);              free((*psem).cnt);
               free((*psem).nopened);
           }
           else
           {
               if ((*(*psem).nopened) == 0)
               {
                   DosFreeMem((*psem).cnt);
               }
         }          }
     }  
   
     if ((*psem).allocated != 0)  
     {     
         free(psem);  
     }  
   
     return(0);          if ((*psem).allocated != 0)
           {   
               free(psem);
           }
   
           return(0);
 #   endif  #   endif
 }  }
   
Line 476  sem_wait_SysV(sem_t *semaphore) Line 468  sem_wait_SysV(sem_t *semaphore)
   
         return(0);          return(0);
 #   else // OS/2  #   else // OS/2
           sem_t       *psem;
   
     sem_t       *psem;          ULONG       cnt;
   
     ULONG       cnt;  
   
     psem = semaphore;          psem = semaphore;
   
     if (DosWaitEventSem((*psem).hev, SEM_INDEFINITE_WAIT) != 0)          if (DosWaitEventSem((*psem).hev, SEM_INDEFINITE_WAIT) != 0)
     {          {
         errno = EINVAL;              errno = EINVAL;
         return(-1);              return(-1);
     }          }
   
     if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0)  
     {  
         errno = EINVAL;  
         return(-1);  
     }  
   
     if ((*(*psem).cnt) > 0)          if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0)
     {          {
         (*(*psem).cnt)--;              errno = EINVAL;
     }              return(-1);
           }
   
     if ((*(*psem).cnt) == 0)          if ((*(*psem).cnt) > 0)
     {          {
         DosResetEventSem((*psem).hev, &cnt);              (*(*psem).cnt)--;
     }          }
   
     DosReleaseMutexSem((*psem).hmtx);          if ((*(*psem).cnt) == 0)
     return(0);          {
               DosResetEventSem((*psem).hev, &cnt);
           }
   
           DosReleaseMutexSem((*psem).hmtx);
           return(0);
 #   endif  #   endif
 }  }
   
Line 532  sem_trywait_SysV(sem_t *semaphore) Line 522  sem_trywait_SysV(sem_t *semaphore)
   
         return(0);          return(0);
 #   else // OS/2  #   else // OS/2
           int         ios;
   
     int         ios;          sem_t       *psem;
   
     sem_t       *psem;  
   
     ULONG       cnt;  
   
     psem = semaphore;          ULONG       cnt;
   
     if ((ios = DosWaitEventSem((*psem).hev, SEM_IMMEDIATE_RETURN)) != 0)          psem = semaphore;
     {  
         errno = (ios == ERROR_TIMEOUT) ? EAGAIN : EINVAL;  
         return(-1);  
     }  
   
     if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0)          if ((ios = DosWaitEventSem((*psem).hev, SEM_IMMEDIATE_RETURN)) != 0)
     {          {
         errno = EINVAL;              errno = (ios == ERROR_TIMEOUT) ? EAGAIN : EINVAL;
         return(-1);              return(-1);
     }          }
   
     if ((*(*psem).cnt) > 0)          if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0)
     {          {
         (*(*psem).cnt)--;              errno = EINVAL;
     }              return(-1);
           }
   
     if ((*(*psem).cnt) == 0)          if ((*(*psem).cnt) > 0)
     {          {
         DosResetEventSem((*psem).hev, &cnt);              (*(*psem).cnt)--;
     }          }
   
     DosReleaseMutexSem((*psem).hmtx);          if ((*(*psem).cnt) == 0)
     return(0);          {
               DosResetEventSem((*psem).hev, &cnt);
           }
   
           DosReleaseMutexSem((*psem).hmtx);
           return(0);
 #   endif  #   endif
 }  }
   
Line 590  sem_post_SysV(sem_t *semaphore) Line 578  sem_post_SysV(sem_t *semaphore)
   
         return(0);          return(0);
 #   else // OS/2  #   else // OS/2
           sem_t               *psem;
   
     sem_t               *psem;          psem = semaphore;
   
     psem = semaphore;  
   
     if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0)  
     {  
         errno = EINVAL;  
         return(-1);  
     }  
   
     (*(*psem).cnt)++;          if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0)
     DosPostEventSem((*psem).hev);          {
     DosReleaseMutexSem((*psem).hmtx);              errno = EINVAL;
               return(-1);
           }
   
     return(0);          (*(*psem).cnt)++;
           DosPostEventSem((*psem).hev);
           DosReleaseMutexSem((*psem).hmtx);
   
           return(0);
 #   endif  #   endif
 }  }
   
Line 623  sem_getvalue_SysV(sem_t *semaphore, int Line 609  sem_getvalue_SysV(sem_t *semaphore, int
   
         return(0);          return(0);
 #   else  #   else
           sem_t               *psem;
   
     sem_t               *psem;          psem = semaphore;
   
     psem = semaphore;          if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0)
           {
     if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0)              errno = EINVAL;
     {              return(-1);
         errno = EINVAL;          }
         return(-1);  
     }  
   
     (*valeur) = (*(*psem).cnt);  
     DosReleaseMutexSem((*psem).hmtx);  
   
     return(0);          (*valeur) = (*(*psem).cnt);
           DosReleaseMutexSem((*psem).hmtx);
   
           return(0);
 #   endif  #   endif
 }  }
   
Line 692  sem_t Line 676  sem_t
         (*semaphore).pid = getpid();          (*semaphore).pid = getpid();
         (*semaphore).tid = pthread_self();          (*semaphore).tid = pthread_self();
 #   else  #   else
           if ((nom_segment = malloc((strlen(racine_memoire_OS2) + strlen(nom) + 1)
     if ((nom_segment = malloc((strlen(racine_memoire_OS2) + strlen(nom) + 1)                  * sizeof(unsigned char))) == NULL)
             * sizeof(unsigned char))) == NULL)  
     {  
         return(SEM_FAILED);  
     }     
   
     sprintf(nom_segment, "%s%s", racine_memoire_OS2, nom);  
     ptr = nom_segment;  
   
     while((*ptr) != d_code_fin_chaine)  
     {  
         if ((*ptr) == '/')  
         {          {
             (*ptr) = '\\';              return(SEM_FAILED);
         }          }   
   
         ptr++;          sprintf(nom_segment, "%s%s", racine_memoire_OS2, nom);
     }          ptr = nom_segment;
   
     if ((nom_absolu = malloc((strlen(racine_semaphores_OS2) + strlen(nom)          while((*ptr) != d_code_fin_chaine)
             + 2) * sizeof(unsigned char))) == NULL)          {
     {              if ((*ptr) == '/')
         return(SEM_FAILED);              {
     }                  (*ptr) = '\\';
               }
   
     sprintf(nom_absolu, "%s%s", racine_semaphores_OS2, nom);              ptr++;
     ptr = nom_absolu;          }
   
     while((*ptr) != d_code_fin_chaine)          if ((nom_absolu = malloc((strlen(racine_semaphores_OS2) + strlen(nom)
     {                  + 2) * sizeof(unsigned char))) == NULL)
         if ((*ptr) == '/')  
         {          {
             (*ptr) = '\\';              return(SEM_FAILED);
         }          }
   
         ptr++;          sprintf(nom_absolu, "%s%s", racine_semaphores_OS2, nom);
     }          ptr = nom_absolu;
   
           while((*ptr) != d_code_fin_chaine)
           {
               if ((*ptr) == '/')
               {
                   (*ptr) = '\\';
               }
   
     (*(ptr + 1)) = d_code_fin_chaine;              ptr++;
           }
   
     if ((psem = malloc(sizeof(sem_t))) == NULL)          (*(ptr + 1)) = d_code_fin_chaine;
     {  
         return(SEM_FAILED);  
     }  
   
     (*psem).allocated = 1;          if ((psem = malloc(sizeof(sem_t))) == NULL)
           {
               return(SEM_FAILED);
           }
   
           (*psem).allocated = 1;
 #   endif  #   endif
   
     if ((oflag & O_CREAT) == 0)      if ((oflag & O_CREAT) == 0)
Line 766  sem_t Line 748  sem_t
                 return(SEM_FAILED);                  return(SEM_FAILED);
             }              }
 #       else // OS/2  #       else // OS/2
         if ((psem = malloc(sizeof(sem_t))) == NULL)              if ((psem = malloc(sizeof(sem_t))) == NULL)
         {              {
             free(nom_absolu);                  free(nom_absolu);
             free(nom_segment);                  free(nom_segment);
             return(SEM_FAILED);                  return(SEM_FAILED);
         }              }
   
         (*ptr) = 'M';  
   
         if (DosOpenMutexSem(nom_absolu, &((*psem).hmtx)) != 0)              (*ptr) = 'M';
         {  
             free(psem);  
             free(nom_absolu);  
             free(nom_segment);  
   
             return(SEM_FAILED);              if (DosOpenMutexSem(nom_absolu, &((*psem).hmtx)) != 0)
         }              {
                   free(psem);
                   free(nom_absolu);
                   free(nom_segment);
   
         (*ptr) = 'S';                  return(SEM_FAILED);
               }
   
         if (DosOpenEventSem(nom_absolu, &((*psem).hev)) != 0)              (*ptr) = 'S';
         {  
             DosCloseMutexSem((*psem).hmtx);  
   
             free(psem);              if (DosOpenEventSem(nom_absolu, &((*psem).hev)) != 0)
             free(nom_absolu);              {
             free(nom_segment);                  DosCloseMutexSem((*psem).hmtx);
   
             return(SEM_FAILED);                  free(psem);
         }                  free(nom_absolu);
                   free(nom_segment);
   
         if (DosGetNamedSharedMem(&base, nom_segment, PAG_WRITE | PAG_READ) != 0)                  return(SEM_FAILED);
         {              }
             DosCloseMutexSem((*psem).hmtx);  
   
             free(nom_absolu);              if (DosGetNamedSharedMem(&base, nom_segment, PAG_WRITE | PAG_READ)
             free(nom_segment);                      != 0)
             free(psem);              {
                   DosCloseMutexSem((*psem).hmtx);
   
             return(SEM_FAILED);                  free(nom_absolu);
         }                  free(nom_segment);
                   free(psem);
   
         free(nom_segment);                  return(SEM_FAILED);
               }
   
         (*psem).cnt = (ULONG *) base;              free(nom_segment);
         (*psem).nopened = ((ULONG *) base) + 1;  
         (*psem).shared = 1;  
   
         if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0)              (*psem).cnt = (ULONG *) base;
         {              (*psem).nopened = ((ULONG *) base) + 1;
             DosCloseMutexSem((*psem).hmtx);              (*psem).shared = 1;
   
             free(nom_absolu);              if (DosRequestMutexSem((*psem).hmtx, SEM_INDEFINITE_WAIT) != 0)
             free(nom_segment);              {
             free(psem);                  DosCloseMutexSem((*psem).hmtx);
   
             return(SEM_FAILED);                  free(nom_absolu);
         }                  free(nom_segment);
                   free(psem);
   
         (*((*psem).nopened))++;                  return(SEM_FAILED);
               }
   
         DosReleaseMutexSem((*psem).hmtx);              (*((*psem).nopened))++;
   
         semaphore = psem;              DosReleaseMutexSem((*psem).hmtx);
   
               semaphore = psem;
 #       endif  #       endif
     }      }
     else      else
Line 884  sem_t Line 866  sem_t
             argument.val = valeur;              argument.val = valeur;
             semctl((*semaphore).sem, 0, SETVAL, argument);              semctl((*semaphore).sem, 0, SETVAL, argument);
 #       else // OS/2  #       else // OS/2
               if ((psem = malloc(sizeof(sem_t))) == NULL)
               {
                   free(nom_absolu);
                   free(nom_segment);
   
         if ((psem = malloc(sizeof(sem_t))) == NULL)                  return(SEM_FAILED);
         {              }
             free(nom_absolu);  
             free(nom_segment);  
   
             return(SEM_FAILED);  
         }  
   
         (*ptr) = 'M';              (*ptr) = 'M';
   
         if (DosCreateMutexSem(nom_absolu, &((*psem).hmtx), 0, 0) != 0)              if (DosCreateMutexSem(nom_absolu, &((*psem).hmtx), 0, 0) != 0)
         {              {
             free(psem);                  free(psem);
             free(nom_absolu);                  free(nom_absolu);
             free(nom_segment);                  free(nom_segment);
   
             return(SEM_FAILED);                  return(SEM_FAILED);
         }              }
   
         (*ptr) = 'S';              (*ptr) = 'S';
   
         if (DosCreateEventSem(nom_absolu, &((*psem).hev), 0,              if (DosCreateEventSem(nom_absolu, &((*psem).hev), 0,
                 (valeur != 0) ? 1 : 0) != 0)                      (valeur != 0) ? 1 : 0) != 0)
         {              {
             DosCloseMutexSem((*psem).hmtx);                  DosCloseMutexSem((*psem).hmtx);
   
             free(nom_absolu);  
             free(nom_segment);  
             free(psem);  
   
             return(SEM_FAILED);                  free(nom_absolu);
         }                  free(nom_segment);
                   free(psem);
   
         if (DosAllocSharedMem(&base, nom_segment, 2 * sizeof(ULONG),                  return(SEM_FAILED);
                 PAG_WRITE | PAG_READ | PAG_COMMIT) != 0)              }
         {  
             DosCloseMutexSem((*psem).hmtx);  
   
             free(nom_absolu);              if (DosAllocSharedMem(&base, nom_segment, 2 * sizeof(ULONG),
             free(nom_segment);                      PAG_WRITE | PAG_READ | PAG_COMMIT) != 0)
             free(psem);              {
                   DosCloseMutexSem((*psem).hmtx);
   
             return(SEM_FAILED);                  free(nom_absolu);
         }                  free(nom_segment);
                   free(psem);
   
         free(nom_segment);                  return(SEM_FAILED);
               }
   
         (*psem).cnt = (ULONG *) base;              free(nom_segment);
         (*psem).nopened = ((ULONG *) base) + 1;  
         (*(*psem).cnt) = valeur;  
         (*(*psem).nopened) = 1;  
         (*psem).shared = 1;  
         semaphore = psem;  
   
               (*psem).cnt = (ULONG *) base;
               (*psem).nopened = ((ULONG *) base) + 1;
               (*(*psem).cnt) = valeur;
               (*(*psem).nopened) = 1;
               (*psem).shared = 1;
               semaphore = psem;
 #       endif  #       endif
     }      }
   
Line 962  sem_close_SysV(sem_t *semaphore) Line 942  sem_close_SysV(sem_t *semaphore)
   
         return(0);          return(0);
 #   else  #   else
           sem_t       *psem;
   
     sem_t       *psem;          psem = semaphore;
   
     psem = semaphore;  
   
     if (DosCloseMutexSem((*psem).hmtx) != 0)          if (DosCloseMutexSem((*psem).hmtx) != 0)
     {          {
         return(EINVAL);              return(EINVAL);
     }          }
   
     while(DosCloseEventSem((*psem).hev) == ERROR_SEM_BUSY)          while(DosCloseEventSem((*psem).hev) == ERROR_SEM_BUSY)
     {          {
         DosPostEventSem((*psem).hev);              DosPostEventSem((*psem).hev);
     }          }
   
     (*(*psem).nopened)--;          (*(*psem).nopened)--;
   
     if ((*psem).shared == 0)          if ((*psem).shared == 0)
     {  
         free((*psem).cnt);  
         free((*psem).nopened);  
     }  
     else  
     {  
         if ((*(*psem).nopened) == 0)  
         {          {
             DosFreeMem((*psem).cnt);              free((*psem).cnt);
               free((*psem).nopened);
           }
           else
           {
               if ((*(*psem).nopened) == 0)
               {
                   DosFreeMem((*psem).cnt);
               }
         }          }
     }  
   
     if ((*psem).allocated != 0)  
     {  
         free(psem);  
     }  
   
     return(0);          if ((*psem).allocated != 0)
           {
               free(psem);
           }
   
           return(0);
 #   endif  #   endif
 }  }
   
Line 1018  sem_unlink_SysV(const char *nom) Line 996  sem_unlink_SysV(const char *nom)
         free(nom);          free(nom);
         return(0);          return(0);
 #   else  #   else
           return(0);
     return(0);  
   
 #   endif  #   endif
 }  }
   

Removed from v.1.38  
changed lines
  Added in v.1.39


CVSweb interface <joel.bertrand@systella.fr>