Diff for /rpl/src/interruptions.c between versions 1.120 and 1.128

version 1.120, 2013/03/20 17:11:45 version 1.128, 2013/05/22 12:05:42
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.1.13    RPL/2 (R) version 4.1.14
   Copyright (C) 1989-2013 Dr. BERTRAND Joël    Copyright (C) 1989-2013 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
Line 99  thread_surveillance_signaux(void *argume Line 99  thread_surveillance_signaux(void *argume
         if (sem_wait(semaphore_signalisation) == 0)          if (sem_wait(semaphore_signalisation) == 0)
 #       endif  #       endif
         {          {
               if ((*s_queue_signaux).requete_arret == d_vrai)
               {
   #               if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV)
                   sem_post(&(*s_queue_signaux).signalisation);
   #               else
                   sem_post(semaphore_signalisation);
   #               endif
   
                   break;
               }
   
 #           if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV)  #           if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV)
             sem_post(&(*s_queue_signaux).signalisation);              sem_post(&(*s_queue_signaux).signalisation);
 #           else  #           else
             sem_post(semaphore_signalisation);              sem_post(semaphore_signalisation);
 #           endif  #           endif
   
             if ((*s_queue_signaux).requete_arret == d_vrai)  
             {  
                 break;  
             }  
   
             nombre_signaux_envoyes = 0;              nombre_signaux_envoyes = 0;
             sched_yield();              sched_yield();
   
Line 153  thread_surveillance_signaux(void *argume Line 159  thread_surveillance_signaux(void *argume
                 if ((*((struct_thread *) (*l_element_courant).donnee)).pid                  if ((*((struct_thread *) (*l_element_courant).donnee)).pid
                         == getpid())                          == getpid())
                 {                  {
                     if ((*(*((struct_thread *) (*l_element_courant).donnee))                      if (pthread_mutex_lock(&mutex_interruptions) != 0)
                             .s_etat_processus).pointeur_signal_ecriture !=                      {
                             (*(*((struct_thread *) (*l_element_courant).donnee))                          (*s_etat_processus).erreur_systeme = d_es_processus;
                             .s_etat_processus).pointeur_signal_lecture)                      }
                       else
                     {                      {
                         nombre_signaux_envoyes++;                          if ((*(*((struct_thread *) (*l_element_courant).donnee))
                         pthread_kill((*((struct_thread *) (*l_element_courant)                                  .s_etat_processus).pointeur_signal_ecriture !=
                                 .donnee)).tid, SIGALRM);                                  (*(*((struct_thread *) (*l_element_courant)
                                   .donnee)).s_etat_processus)
                                   .pointeur_signal_lecture)
                           {
                               nombre_signaux_envoyes++;
                               pthread_kill((*((struct_thread *)
                                       (*l_element_courant).donnee)).tid, SIGALRM);
                           }
   
                           if (pthread_mutex_unlock(&mutex_interruptions) != 0)
                           {
                               (*s_etat_processus).erreur_systeme = d_es_processus;
                           }
                     }                      }
                 }                  }
   
Line 555  liberation_threads(struct_processus *s_e Line 574  liberation_threads(struct_processus *s_e
     struct_liste_variables_statiques            *l_element_statique_courant;      struct_liste_variables_statiques            *l_element_statique_courant;
     struct_liste_variables_statiques            *l_element_statique_suivant;      struct_liste_variables_statiques            *l_element_statique_suivant;
   
     unsigned long                               i;      integer8                                    i;
   
     void                                        *element_candidat;      void                                        *element_candidat;
     void                                        *element_courant;      void                                        *element_courant;
Line 598  liberation_threads(struct_processus *s_e Line 617  liberation_threads(struct_processus *s_e
             close((*s_etat_processus).pipe_injections);              close((*s_etat_processus).pipe_injections);
             close((*s_etat_processus).pipe_nombre_injections);              close((*s_etat_processus).pipe_nombre_injections);
             close((*s_etat_processus).pipe_interruptions);              close((*s_etat_processus).pipe_interruptions);
             close((*s_etat_processus).pipe_nombre_objets_attente);              close((*s_etat_processus).pipe_nombre_elements_attente);
             close((*s_etat_processus).pipe_nombre_interruptions_attente);  
   
             liberation(s_etat_processus, (*s_etat_processus).at_exit);              liberation(s_etat_processus, (*s_etat_processus).at_exit);
   
Line 667  liberation_threads(struct_processus *s_e Line 685  liberation_threads(struct_processus *s_e
                     close((*s_argument_thread).pipe_acquittement[1]);                      close((*s_argument_thread).pipe_acquittement[1]);
                     close((*s_argument_thread).pipe_injections[1]);                      close((*s_argument_thread).pipe_injections[1]);
                     close((*s_argument_thread).pipe_nombre_injections[1]);                      close((*s_argument_thread).pipe_nombre_injections[1]);
                     close((*s_argument_thread).pipe_nombre_objets_attente[0]);                      close((*s_argument_thread).pipe_nombre_elements_attente[0]);
                     close((*s_argument_thread).pipe_interruptions[0]);                      close((*s_argument_thread).pipe_interruptions[0]);
                     close((*s_argument_thread)  
                             .pipe_nombre_interruptions_attente[0]);  
   
                     if (pthread_mutex_unlock(&((*s_argument_thread)                      if (pthread_mutex_unlock(&((*s_argument_thread)
                             .mutex_nombre_references)) != 0)                              .mutex_nombre_references)) != 0)
Line 1311  liberation_threads(struct_processus *s_e Line 1327  liberation_threads(struct_processus *s_e
             close((*s_argument_thread).pipe_acquittement[1]);              close((*s_argument_thread).pipe_acquittement[1]);
             close((*s_argument_thread).pipe_injections[1]);              close((*s_argument_thread).pipe_injections[1]);
             close((*s_argument_thread).pipe_nombre_injections[1]);              close((*s_argument_thread).pipe_nombre_injections[1]);
             close((*s_argument_thread).pipe_nombre_objets_attente[0]);              close((*s_argument_thread).pipe_nombre_elements_attente[0]);
             close((*s_argument_thread).pipe_interruptions[0]);              close((*s_argument_thread).pipe_interruptions[0]);
             close((*s_argument_thread).pipe_nombre_interruptions_attente[0]);  
   
             if (pthread_mutex_unlock(&((*s_argument_thread)              if (pthread_mutex_unlock(&((*s_argument_thread)
                     .mutex_nombre_references)) != 0)                      .mutex_nombre_references)) != 0)
Line 2409  signal_hup(struct_processus *s_etat_proc Line 2424  signal_hup(struct_processus *s_etat_proc
         return;          return;
     }      }
   
     snprintf(nom, 8 + 64 + 1, "rpl-out-%lu-%lu", (unsigned long) getpid(),      snprintf(nom, 8 + 64 + 1, "rpl-out-%llu-%llu",
             (unsigned long) pthread_self());              (unsigned long long) getpid(),
               (unsigned long long) pthread_self());
   
     if ((fichier = fopen(nom, "w+")) != NULL)      if ((fichier = fopen(nom, "w+")) != NULL)
     {      {
Line 2951  envoi_signal_thread(pthread_t tid, enum Line 2967  envoi_signal_thread(pthread_t tid, enum
   
     struct_processus                        *s_etat_processus;      struct_processus                        *s_etat_processus;
   
       if (pthread_mutex_lock(&mutex_interruptions) != 0)
       {
           pthread_mutex_unlock(&mutex_liste_threads);
           return(1);
       }
   
     if (pthread_mutex_lock(&mutex_liste_threads) != 0)      if (pthread_mutex_lock(&mutex_liste_threads) != 0)
     {      {
         return(1);          return(1);
Line 2976  envoi_signal_thread(pthread_t tid, enum Line 2998  envoi_signal_thread(pthread_t tid, enum
         return(1);          return(1);
     }      }
   
     if (pthread_mutex_lock(&mutex_interruptions) != 0)  
     {  
         pthread_mutex_unlock(&mutex_liste_threads);  
         return(1);  
     }  
   
     s_etat_processus = (*((struct_thread *) (*l_element_courant).donnee))      s_etat_processus = (*((struct_thread *) (*l_element_courant).donnee))
             .s_etat_processus;              .s_etat_processus;
   
Line 3320  liberation_queue_signaux(struct_processu Line 3336  liberation_queue_signaux(struct_processu
 #       endif  #       endif
 #   else // POSIX  #   else // POSIX
 #       ifndef SEMAPHORES_NOMMES  #       ifndef SEMAPHORES_NOMMES
             sem_close(&((*s_queue_signaux).semaphore));              // Rien à faire, les sémaphores sont anonymes.
             sem_close(&((*s_queue_signaux).signalisation));  
 #       else  #       else
             sem_close(semaphore_queue_signaux);              sem_close(semaphore_queue_signaux);
             sem_close(semaphore_signalisation);              sem_close(semaphore_signalisation);
Line 3360  destruction_queue_signaux(struct_process Line 3375  destruction_queue_signaux(struct_process
         unsigned char       *nom;          unsigned char       *nom;
 #   endif  #   endif
   
     // Incrémenter le sémaphore pour être sûr de le débloquer.  #   if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV)
       sem_wait(&((*s_queue_signaux).signalisation));
   #   else
       sem_wait(semaphore_signalisation);
   #   endif
   
     (*s_queue_signaux).requete_arret = d_vrai;      (*s_queue_signaux).requete_arret = d_vrai;
   
Line 3370  destruction_queue_signaux(struct_process Line 3389  destruction_queue_signaux(struct_process
     sem_post(semaphore_signalisation);      sem_post(semaphore_signalisation);
 #   endif  #   endif
   
       // Incrémenter le sémaphore pour être sûr de le débloquer.
   
   #   if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV)
       sem_post(&((*s_queue_signaux).signalisation));
   #   else
       sem_post(semaphore_signalisation);
   #   endif
   
     pthread_join((*s_queue_signaux).thread_signaux, NULL);      pthread_join((*s_queue_signaux).thread_signaux, NULL);
   
 #   ifdef IPCS_SYSV // SystemV  #   ifdef IPCS_SYSV // SystemV
Line 3430  destruction_queue_signaux(struct_process Line 3457  destruction_queue_signaux(struct_process
 #       endif  #       endif
 #   else // POSIX  #   else // POSIX
 #       ifndef SEMAPHORES_NOMMES  #       ifndef SEMAPHORES_NOMMES
             sem_close(&((*s_queue_signaux).semaphore));  
             sem_destroy(&((*s_queue_signaux).semaphore));              sem_destroy(&((*s_queue_signaux).semaphore));
   
             sem_close(&((*s_queue_signaux).signalisation));  
             sem_destroy(&((*s_queue_signaux).signalisation));              sem_destroy(&((*s_queue_signaux).signalisation));
 #       else  #       else
             sem_close(semaphore_queue_signaux);              sem_close(semaphore_queue_signaux);

Removed from v.1.120  
changed lines
  Added in v.1.128


CVSweb interface <joel.bertrand@systella.fr>