Diff for /rpl/src/interruptions.c between versions 1.70 and 1.71

version 1.70, 2011/09/15 19:23:54 version 1.71, 2011/09/15 19:30:38
Line 2347  nom_segment(unsigned char *chemin, pid_t Line 2347  nom_segment(unsigned char *chemin, pid_t
 }  }
   
   
   /*
   ================================================================================
     Fonctions d'envoi d'un signal à un thread ou à un processus.
   ================================================================================
     Entrée : processus et signal
   --------------------------------------------------------------------------------
     Sortie : erreur
   --------------------------------------------------------------------------------
     Effet de bord : Néant
   ================================================================================
   */
   
 int  int
 envoi_signal_processus(pid_t pid, enum signaux_rpl signal)  envoi_signal_processus(pid_t pid, enum signaux_rpl signal)
 {  {
Line 2541  creation_queue_signaux(struct_processus Line 2553  creation_queue_signaux(struct_processus
     racine_segment = (*s_etat_processus).chemin_fichiers_temporaires;      racine_segment = (*s_etat_processus).chemin_fichiers_temporaires;
   
 #   ifndef IPCS_SYSV // POSIX  #   ifndef IPCS_SYSV // POSIX
           if ((nom = nom_segment((*s_etat_processus).chemin_fichiers_temporaires,
                   getpid())) == NULL)
           {
               (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
               return;
           }
   
     if ((nom = nom_segment((*s_etat_processus).chemin_fichiers_temporaires,          if ((f_queue_signaux = shm_open(nom, O_RDWR | O_CREAT | O_EXCL,
             getpid())) == NULL)                  S_IRUSR | S_IWUSR)) == -1)
     {  
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;  
         return;  
     }  
   
     if ((f_queue_signaux = shm_open(nom, O_RDWR | O_CREAT | O_EXCL,  
             S_IRUSR | S_IWUSR)) == -1)  
     {  
         free(nom);  
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;  
         return;  
     }  
   
     if (ftruncate(f_queue_signaux, sizeof(struct_queue_signaux)) == -1)  
     {  
         free(nom);  
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;  
         return;  
     }  
   
     s_queue_signaux = mmap(NULL, sizeof(struct_queue_signaux),  
             PROT_READ | PROT_WRITE, MAP_SHARED, f_queue_signaux, 0);  
   
     if (((void *) s_queue_signaux) == ((void *) -1))  
     {  
         if (shm_unlink(nom) == -1)  
         {          {
             free(nom);              free(nom);
             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;              (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
             return;              return;
         }          }
   
         free(nom);          if (ftruncate(f_queue_signaux, sizeof(struct_queue_signaux)) == -1)
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;          {
         return;              free(nom);
     }              (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
               return;
     free(nom);          }
   
 #   ifndef SEMAPHORES_NOMMES  
     sem_init(&((*s_queue_signaux).semaphore), 1, 1);  
 #   else  
     (*s_queue_signaux).semaphore = sem_init2(0, sem_gestionnaires_signaux);  
   
     if ((*s_queue_signaux).semaphore == SEM_FAILED)  
     {  
         (*s_etat_processus).erreur_systeme = d_es_processus;  
         return;  
     }  
 #   endif  
   
     (*s_queue_signaux).pointeur_lecture = 0;  
     (*s_queue_signaux).pointeur_ecriture = 0;  
   
     if (msync(s_queue_signaux, sizeof(struct_queue_signaux), 0))  
     {  
         (*s_etat_processus).erreur_systeme = d_es_processus;  
         return;  
     }  
   
 #   else // SystemV  
 #   ifndef OS2  
   
     file                            *desc;  
   
     key_t                           clef;  
   
     // Création d'un segment de données associé au PID du processus courant  
   
     chemin = (*s_etat_processus).chemin_fichiers_temporaires;  
   
     if ((nom = nom_segment((*s_etat_processus).chemin_fichiers_temporaires,  
             getpid())) == NULL)  
     {  
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;  
         return;  
     }  
   
     if ((desc = fopen(nom, "w")) == NULL)  
     {  
         (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;  
         return;  
     }  
   
     fclose(desc);          s_queue_signaux = mmap(NULL, sizeof(struct_queue_signaux),
                   PROT_READ | PROT_WRITE, MAP_SHARED, f_queue_signaux, 0);
   
     if ((clef = ftok(nom, 1)) == -1)          if (((void *) s_queue_signaux) == ((void *) -1))
     {          {
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;              if (shm_unlink(nom) == -1)
         return;              {
     }                  free(nom);
                   (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   return;
               }
   
     free(nom);              free(nom);
               (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
               return;
           }
   
     if ((segment = shmget(clef,          free(nom);
             nombre_queues * ((2 * longueur_queue) + 4) * sizeof(int),  #       ifndef SEMAPHORES_NOMMES
             IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR)) == -1)              sem_init(&((*s_queue_signaux).semaphore), 1, 1);
     {  #       else
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;              (*s_queue_signaux).semaphore = sem_init2(0,
         return;                      sem_gestionnaires_signaux);
     }  
               if ((*s_queue_signaux).semaphore == SEM_FAILED)
               {
                   (*s_etat_processus).erreur_systeme = d_es_processus;
                   return;
               }
   #       endif
   
     fifos = shmat(segment, NULL, 0);          (*s_queue_signaux).pointeur_lecture = 0;
           (*s_queue_signaux).pointeur_ecriture = 0;
   
     if (((void *) fifos) == ((void *) -1))          if (msync(s_queue_signaux, sizeof(struct_queue_signaux), 0))
     {  
         if (shmctl(segment, IPC_RMID, 0) == -1)  
         {          {
             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;              (*s_etat_processus).erreur_systeme = d_es_processus;
             return;              return;
         }          }
   #   else // SystemV
   #       ifndef OS2
               file                            *desc;
   
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;              key_t                           clef;
         return;  
     }  
   
 #   else              // Création d'un segment de données associé au PID du processus
               // courant
   
     if ((nom = nom_segment(NULL, getpid())) == NULL)              chemin = (*s_etat_processus).chemin_fichiers_temporaires;
     {  
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;  
         return;  
     }  
   
     if (DosAllocSharedMem(&ptr_os2, nom, nombre_queues *              if ((nom = nom_segment((*s_etat_processus)
             ((2 * longueur_queue) + 4) * sizeof(int),                      .chemin_fichiers_temporaires, getpid())) == NULL)
             PAG_WRITE | PAG_READ | PAG_COMMIT) != 0)              {
     {                  (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
         free(nom);                  return;
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;              }
         return;  
     }              if ((desc = fopen(nom, "w")) == NULL)
               {
                   (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                   return;
               }
   
               fclose(desc);
   
               if ((clef = ftok(nom, 1)) == -1)
               {
                   (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   return;
               }
   
     free(nom);              free(nom);
     fifos = ptr_os2;  
   
 #   endif              if ((segment = shmget(clef,
                       nombre_queues * ((2 * longueur_queue) + 4) * sizeof(int),
                       IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR)) == -1)
               {
                   (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   return;
               }
   
               fifos = shmat(segment, NULL, 0);
   
               if (((void *) fifos) == ((void *) -1))
               {
                   if (shmctl(segment, IPC_RMID, 0) == -1)
                   {
                       (*s_etat_processus).erreur_systeme =
                               d_es_allocation_memoire;
                       return;
                   }
   
                   (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   return;
               }
   #       else // OS/2
               if ((nom = nom_segment(NULL, getpid())) == NULL)
               {
                   (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   return;
               }
   
               if (DosAllocSharedMem(&ptr_os2, nom, nombre_queues *
                       ((2 * longueur_queue) + 4) * sizeof(int),
                       PAG_WRITE | PAG_READ | PAG_COMMIT) != 0)
               {
                   free(nom);
                   (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   return;
               }
   
               free(nom);
               fifos = ptr_os2;
   #       endif
 #   endif  #   endif
   
     return;      return;
Line 2708  liberation_queue_signaux(struct_processu Line 2716  liberation_queue_signaux(struct_processu
 #       else // OS/2  #       else // OS/2
 #       endif  #       endif
 #   else // POSIX  #   else // POSIX
   
         sem_close(&((*s_queue_signaux).semaphore));          sem_close(&((*s_queue_signaux).semaphore));
   
         if (munmap(s_queue_signaux, sizeof(struct_queue_signaux)) != 0)          if (munmap(s_queue_signaux, sizeof(struct_queue_signaux)) != 0)
Line 2743  destruction_queue_signaux(struct_process Line 2750  destruction_queue_signaux(struct_process
     unsigned char       *nom;      unsigned char       *nom;
   
 #   ifdef IPCS_SYSV // SystemV  #   ifdef IPCS_SYSV // SystemV
 #   ifndef OS2  #       ifndef OS2
               if (shmdt(fifos) == -1)
     if (shmdt(fifos) == -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(segment, IPC_RMID, 0) == -1)              {
     {                  (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;                  return;
         return;              }
     }  
               if ((nom = nom_segment((*s_etat_processus)
     if ((nom = nom_segment((*s_etat_processus).chemin_fichiers_temporaires,                      .chemin_fichiers_temporaires, getpid())) == NULL)
             getpid())) == NULL)              {
     {                  (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;                  return;
         return;              }
     }  
   
     // FERMER LE FICHIER  
   
     unlink(nom);  
     free(nom);  
   
 #   else              // FERMER LE FICHIER
   
     if (DosFreeMem(fifos) != 0)              unlink(nom);
     {              free(nom);
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;  #       else
         return;              if (DosFreeMem(fifos) != 0)
     }              {
                   (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   return;
               }
   
     // FERMER LE FICHIER          // FERMER LE FICHIER
   
 #   endif  #       endif
 #   else // POSIX  #   else // POSIX
         sem_close(&((*s_queue_signaux).semaphore));          sem_close(&((*s_queue_signaux).semaphore));
         sem_destroy(&((*s_queue_signaux).semaphore));          sem_destroy(&((*s_queue_signaux).semaphore));

Removed from v.1.70  
changed lines
  Added in v.1.71


CVSweb interface <joel.bertrand@systella.fr>