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

version 1.69, 2011/09/15 17:51:43 version 1.70, 2011/09/15 19:23:54
Line 2172  static inline void Line 2172  static inline void
 envoi_interruptions(struct_processus *s_etat_processus, enum signaux_rpl signal,  envoi_interruptions(struct_processus *s_etat_processus, enum signaux_rpl signal,
         pid_t pid_source)          pid_t pid_source)
 {  {
 uprintf("Signal : %d\n", signal);  
     switch(signal)      switch(signal)
     {      {
         case rpl_signull:          case rpl_signull:
Line 2252  scrutation_interruptions(struct_processu Line 2251  scrutation_interruptions(struct_processu
     // à lire. Les pointeurs d'écriture pointent sur les prochains éléments à      // à lire. Les pointeurs d'écriture pointent sur les prochains éléments à
     // écrire.      // écrire.
   
     if (pthread_mutex_trylock(&((*s_queue_signaux).mutex)) == 0)      if (sem_trywait(&((*s_queue_signaux).semaphore)) == 0)
     {      {
         if ((*s_queue_signaux).pointeur_lecture !=          if ((*s_queue_signaux).pointeur_lecture !=
                 (*s_queue_signaux).pointeur_ecriture)                  (*s_queue_signaux).pointeur_ecriture)
Line 2267  scrutation_interruptions(struct_processu Line 2266  scrutation_interruptions(struct_processu
             (*s_queue_signaux).pointeur_lecture =              (*s_queue_signaux).pointeur_lecture =
                     ((*s_queue_signaux).pointeur_lecture + 1)                      ((*s_queue_signaux).pointeur_lecture + 1)
                     % LONGUEUR_QUEUE_SIGNAUX;                      % LONGUEUR_QUEUE_SIGNAUX;
 uprintf("Traité\n");  
         }          }
   
         pthread_mutex_unlock(&((*s_queue_signaux).mutex));          sem_post(&((*s_queue_signaux).semaphore));
     }      }
   
     // Interruptions qui arrivent depuis le groupe courant de threads.      // Interruptions qui arrivent depuis le groupe courant de threads.
Line 2370  envoi_signal_processus(pid_t pid, enum s Line 2368  envoi_signal_processus(pid_t pid, enum s
             return(1);              return(1);
         }          }
   
         if (pthread_mutex_lock(&((*s_queue_signaux).mutex)) != 0)          if (sem_wait(&((*s_queue_signaux).semaphore)) != 0)
         {          {
             return(1);              return(1);
         }          }
Line 2384  envoi_signal_processus(pid_t pid, enum s Line 2382  envoi_signal_processus(pid_t pid, enum s
                 ((*s_queue_signaux).pointeur_ecriture + 1)                  ((*s_queue_signaux).pointeur_ecriture + 1)
                 % LONGUEUR_QUEUE_SIGNAUX;                  % LONGUEUR_QUEUE_SIGNAUX;
   
         if (pthread_mutex_unlock(&((*s_queue_signaux).mutex)) != 0)          if (sem_post(&((*s_queue_signaux).semaphore)) != 0)
         {          {
             return(1);              return(1);
         }          }
Line 2414  envoi_signal_processus(pid_t pid, enum s Line 2412  envoi_signal_processus(pid_t pid, enum s
             return(1);              return(1);
         }          }
   
 uprintf("Lock\n");          if (sem_wait(&((*queue).semaphore)) != 0)
         if (pthread_mutex_lock(&((*queue).mutex)) != 0)  
         {          {
 uprintf("Unlock (error)\n");  
             return(1);              return(1);
         }          }
   
Line 2427  uprintf("Unlock (error)\n"); Line 2423  uprintf("Unlock (error)\n");
         (*queue).pointeur_ecriture = ((*queue).pointeur_ecriture + 1)          (*queue).pointeur_ecriture = ((*queue).pointeur_ecriture + 1)
                 % LONGUEUR_QUEUE_SIGNAUX;                  % LONGUEUR_QUEUE_SIGNAUX;
   
 uprintf("Unlock\n");          if (sem_post(&((*queue).semaphore)) != 0)
         if (pthread_mutex_unlock(&((*queue).mutex)) != 0)  
         {          {
 uprintf("Unlock failed\n");  
             return(1);              return(1);
         }          }
   
Line 2542  envoi_signal_contexte(struct_processus * Line 2536  envoi_signal_contexte(struct_processus *
 void  void
 creation_queue_signaux(struct_processus *s_etat_processus)  creation_queue_signaux(struct_processus *s_etat_processus)
 {  {
     pthread_mutexattr_t             attributs_mutex;  
   
     unsigned char                   *nom;      unsigned char                   *nom;
   
     racine_segment = (*s_etat_processus).chemin_fichiers_temporaires;      racine_segment = (*s_etat_processus).chemin_fichiers_temporaires;
Line 2591  creation_queue_signaux(struct_processus Line 2583  creation_queue_signaux(struct_processus
   
     free(nom);      free(nom);
   
     pthread_mutexattr_init(&attributs_mutex);  #   ifndef SEMAPHORES_NOMMES
     pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL);      sem_init(&((*s_queue_signaux).semaphore), 1, 1);
     pthread_mutex_init(&((*s_queue_signaux).mutex), &attributs_mutex);  #   else
     pthread_mutexattr_destroy(&attributs_mutex);      (*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_lecture = 0;
     (*s_queue_signaux).pointeur_ecriture = 0;      (*s_queue_signaux).pointeur_ecriture = 0;
Line 2709  liberation_queue_signaux(struct_processu Line 2708  liberation_queue_signaux(struct_processu
 #       else // OS/2  #       else // OS/2
 #       endif  #       endif
 #   else // POSIX  #   else // POSIX
   
           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)
         {          {
             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;              (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
Line 2779  destruction_queue_signaux(struct_process Line 2781  destruction_queue_signaux(struct_process
   
 #   endif  #   endif
 #   else // POSIX  #   else // POSIX
           sem_close(&((*s_queue_signaux).semaphore));
           sem_destroy(&((*s_queue_signaux).semaphore));
   
     if (munmap(s_queue_signaux, sizeof(struct_queue_signaux)) != 0)          if (munmap(s_queue_signaux, sizeof(struct_queue_signaux)) != 0)
     {          {
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;              (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
         return;              return;
     }          }
   
     if ((nom = nom_segment(NULL, getpid())) == NULL)  
     {  
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;  
         return;  
     }  
   
     close(f_queue_signaux);          if ((nom = nom_segment(NULL, getpid())) == NULL)
           {
               (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
               return;
           }
   
     if (shm_unlink(nom) != 0)          close(f_queue_signaux);
     {  
         free(nom);  
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;  
         return;  
     }  
   
     free(nom);          if (shm_unlink(nom) != 0)
           {
               free(nom);
               (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
               return;
           }
   
           free(nom);
 #   endif  #   endif
   
     return;      return;

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


CVSweb interface <joel.bertrand@systella.fr>