Diff for /rpl/src/interruptions.c between versions 1.74 and 1.75

version 1.74, 2011/09/18 18:06:01 version 1.75, 2011/09/19 17:33:17
Line 59  static volatile struct_liste_chainee_vol Line 59  static volatile struct_liste_chainee_vol
         = NULL;          = NULL;
 static volatile int                             code_erreur_gsl = 0;  static volatile int                             code_erreur_gsl = 0;
   
 static unsigned char                            *racine_segment;  unsigned char                                   *racine_segment;
   
 static pthread_mutex_t                          mutex_interruptions  static pthread_mutex_t                          mutex_interruptions
         = PTHREAD_MUTEX_INITIALIZER;          = PTHREAD_MUTEX_INITIALIZER;
Line 2372  envoi_signal_processus(pid_t pid, enum s Line 2372  envoi_signal_processus(pid_t pid, enum s
 {  {
     int                             segment;      int                             segment;
   
     sem_t                           *semaphore;  #   ifndef IPCS_SYSV
   #       ifdef SEMAPHORES_NOMMES
               sem_t                   *semaphore;
   #       endif
   #   else
           int                         desc;
           key_t                       clef;
   #   endif
   
     struct_queue_signaux            *queue;      struct_queue_signaux            *queue;
   
Line 2387  envoi_signal_processus(pid_t pid, enum s Line 2394  envoi_signal_processus(pid_t pid, enum s
   
         if (s_queue_signaux == NULL)          if (s_queue_signaux == NULL)
         {          {
               uprintf("Paf !\n");
             return(1);              return(1);
         }          }
   
Line 2421  envoi_signal_processus(pid_t pid, enum s Line 2429  envoi_signal_processus(pid_t pid, enum s
     {      {
         // Le signal est envoyé depuis un processus distinct.          // Le signal est envoyé depuis un processus distinct.
   
         if ((nom = nom_segment(racine_segment, pid)) == NULL)  #       ifdef IPCS_SYSV
         {              if ((nom = nom_segment(racine_segment, getpid())) == NULL)
             return(1);              {
         }                  return(1);
               }
   
               if ((desc = open(nom, O_RDWR)) == -1)
               {
                   free(nom);
                   return(1);
               }
   
               close(desc);
   
               if ((clef = ftok(nom, 1)) == -1)
               {
                   free(nom);
                   return(1);
               }
   
         if ((segment = shm_open(nom, O_RDWR, 0)) == -1)  
         {  
             free(nom);              free(nom);
             return(1);  
         }  
   
         free(nom);              if ((segment = shmget(clef, sizeof(struct_queue_signaux), 0)) == -1)
               {
                   return(1);
               }
   
         if ((queue = mmap(NULL, sizeof(struct_queue_signaux),              queue = shmat(segment, NULL, 0);
                 PROT_READ | PROT_WRITE, MAP_SHARED, segment, 0)) ==  #       else // POSIX
                 MAP_FAILED)              if ((nom = nom_segment(racine_segment, pid)) == NULL)
         {              {
             close(segment);                  return(1);
             return(1);              }
         }  
   
 #       ifndef SEMAPHORES_NOMMES              if ((segment = shm_open(nom, O_RDWR, 0)) == -1)
             if (sem_wait(&((*queue).semaphore)) != 0)  
             {              {
                   free(nom);
                 return(1);                  return(1);
             }              }
 #       else  
             if ((semaphore = sem_open2(pid)) == SEM_FAILED)              free(nom);
   
               if ((queue = mmap(NULL, sizeof(struct_queue_signaux),
                       PROT_READ | PROT_WRITE, MAP_SHARED, segment, 0)) ==
                       MAP_FAILED)
             {              {
                   close(segment);
                 return(1);                  return(1);
             }              }
   #       endif
   
             if (sem_wait(semaphore) != 0)              // À ce moment, le segment de mémoire partagée est projeté
               // dans l'espace du processus.
   
   #       ifndef IPCS_SYSV // POSIX
   #           ifndef SEMAPHORES_NOMMES
                   if (sem_wait(&((*queue).semaphore)) != 0)
                   {
                       return(1);
                   }
   #           else
                   if ((semaphore = sem_open2(pid)) == SEM_FAILED)
                   {
                       return(1);
                   }
   
                   if (sem_wait(semaphore) != 0)
                   {
                       sem_close(semaphore);
                       return(1);
                   }
   #           endif
   #       else // IPCS_SYSV
               if (sem_wait(&((*queue).semaphore)) != 0)
             {              {
                 sem_close(semaphore);  
                 return(1);                  return(1);
             }              }
 #       endif  #       endif
Line 2466  envoi_signal_processus(pid_t pid, enum s Line 2514  envoi_signal_processus(pid_t pid, enum s
         (*queue).pointeur_ecriture = ((*queue).pointeur_ecriture + 1)          (*queue).pointeur_ecriture = ((*queue).pointeur_ecriture + 1)
                 % LONGUEUR_QUEUE_SIGNAUX;                  % LONGUEUR_QUEUE_SIGNAUX;
   
 #       ifndef SEMAPHORES_NOMMES  #       ifndef IPCS_SYSV // POSIX
             if (sem_post(&((*queue).semaphore)) != 0)  #           ifndef SEMAPHORES_NOMMES
                   if (sem_post(&((*queue).semaphore)) != 0)
                   {
                       return(1);
                   }
   #           else
                   if (sem_post(semaphore) != 0)
                   {
                       sem_close(semaphore);
                       return(1);
                   }
   
                   if (sem_close(semaphore) != 0)
                   {
                       return(1);
                   }
   #           endif
   
               if (munmap(queue, sizeof(struct_queue_signaux)) != 0)
             {              {
                   close(segment);
                 return(1);                  return(1);
             }              }
 #       else  #       else // IPCS_SYSV
             if (sem_post(semaphore) != 0)              if (sem_post(&((*queue).semaphore)) != 0)
             {              {
                 sem_close(semaphore);  
                 return(1);                  return(1);
             }              }
   
             if (sem_close(semaphore) != 0)              if (shmdt(queue) != 0)
             {              {
                 return(1);                  return(1);
             }              }
 #       endif  #       endif
   
         if (munmap(queue, sizeof(struct_queue_signaux)) != 0)  
         {  
             close(segment);  
             return(1);  
         }  
   
         close(segment);          close(segment);
     }      }
   
Line 2637  creation_queue_signaux(struct_processus Line 2697  creation_queue_signaux(struct_processus
         }          }
   
         free(nom);          free(nom);
   
 #       ifndef SEMAPHORES_NOMMES  #       ifndef SEMAPHORES_NOMMES
             sem_init(&((*s_queue_signaux).semaphore), 1, 1);              sem_init(&((*s_queue_signaux).semaphore), 1, 1);
 #       else  #       else
Line 2656  creation_queue_signaux(struct_processus Line 2717  creation_queue_signaux(struct_processus
             (*s_etat_processus).erreur_systeme = d_es_processus;              (*s_etat_processus).erreur_systeme = d_es_processus;
             return;              return;
         }          }
 #   else // SystemV  #   else // IPCS_SYSV
 #       ifndef OS2  #       ifndef OS2
             file                            *desc;              int                             segment;
               int                             support;
   
             key_t                           clef;              key_t                           clef;
   
             // Création d'un segment de données associé au PID du processus              // Création d'un segment de données associé au PID du processus
             // courant              // courant
   
             chemin = (*s_etat_processus).chemin_fichiers_temporaires;  
   
             if ((nom = nom_segment((*s_etat_processus)              if ((nom = nom_segment((*s_etat_processus)
                     .chemin_fichiers_temporaires, getpid())) == NULL)                      .chemin_fichiers_temporaires, getpid())) == NULL)
             {              {
Line 2674  creation_queue_signaux(struct_processus Line 2734  creation_queue_signaux(struct_processus
                 return;                  return;
             }              }
   
             if ((desc = fopen(nom, "w")) == NULL)              if ((support = open(nom, O_RDWR | O_CREAT | O_EXCL |
                       S_IRUSR | S_IWUSR)) == -1)
             {              {
                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;                  (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                 return;                  return;
             }              }
   
             fclose(desc);  
   
             if ((clef = ftok(nom, 1)) == -1)              if ((clef = ftok(nom, 1)) == -1)
             {              {
                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;                  (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                 return;                  return;
             }              }
   
               close(support);
             free(nom);              free(nom);
   
             if ((segment = shmget(clef,              if ((segment = shmget(clef, sizeof(struct_queue_signaux),
                     nombre_queues * ((2 * longueur_queue) + 4) * sizeof(int),  
                     IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR)) == -1)                      IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR)) == -1)
             {              {
                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;                  (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                 return;                  return;
             }              }
   
             fifos = shmat(segment, NULL, 0);              s_queue_signaux = shmat(segment, NULL, 0);
               f_queue_signaux = segment;
   
             if (((void *) fifos) == ((void *) -1))              if (((void *) s_queue_signaux) == ((void *) -1))
             {              {
                 if (shmctl(segment, IPC_RMID, 0) == -1)                  if (shmctl(f_queue_signaux, IPC_RMID, 0) == -1)
                 {                  {
                     (*s_etat_processus).erreur_systeme =                      (*s_etat_processus).erreur_systeme =
                             d_es_allocation_memoire;                              d_es_allocation_memoire;
Line 2712  creation_queue_signaux(struct_processus Line 2772  creation_queue_signaux(struct_processus
                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;                  (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                 return;                  return;
             }              }
   
               sem_init(&((*s_queue_signaux).semaphore), 1, 1);
               (*s_queue_signaux).pointeur_lecture = 0;
               (*s_queue_signaux).pointeur_ecriture = 0;
 #       else // OS/2  #       else // OS/2
             if ((nom = nom_segment(NULL, getpid())) == NULL)              if ((nom = nom_segment(NULL, getpid())) == NULL)
             {              {
Line 2755  liberation_queue_signaux(struct_processu Line 2819  liberation_queue_signaux(struct_processu
 {  {
 #   ifdef IPCS_SYSV // SystemV  #   ifdef IPCS_SYSV // SystemV
 #       ifndef OS2  #       ifndef OS2
               if (shmdt(s_queue_signaux) == -1)
               {
                   (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   return;
               }
 #       else // OS/2  #       else // OS/2
 #       endif  #       endif
 #   else // POSIX  #   else // POSIX
Line 2797  destruction_queue_signaux(struct_process Line 2866  destruction_queue_signaux(struct_process
   
 #   ifdef IPCS_SYSV // SystemV  #   ifdef IPCS_SYSV // SystemV
 #       ifndef OS2  #       ifndef OS2
             if (shmdt(fifos) == -1)              // Il faut commencer par éliminer le sémaphore.
   
               if (semctl((*s_queue_signaux).semaphore.sem, 0, IPC_RMID) == -1)
               {
                   (*s_etat_processus).erreur_systeme = d_es_processus;
                   return;
               }
   
               unlink((*s_queue_signaux).semaphore.path);
   
               if (shmdt(s_queue_signaux) == -1)
             {              {
                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;                  (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                 return;                  return;
             }              }
   
             if (shmctl(segment, IPC_RMID, 0) == -1)              if (shmctl(f_queue_signaux, IPC_RMID, 0) == -1)
             {              {
                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;                  (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                 return;                  return;
Line 2816  destruction_queue_signaux(struct_process Line 2895  destruction_queue_signaux(struct_process
                 return;                  return;
             }              }
   
             // FERMER LE FICHIER  
   
             unlink(nom);              unlink(nom);
             free(nom);              free(nom);
 #       else  #       else

Removed from v.1.74  
changed lines
  Added in v.1.75


CVSweb interface <joel.bertrand@systella.fr>