Diff for /rpl/src/interruptions.c between versions 1.184 and 1.197

version 1.184, 2016/07/22 15:08:43 version 1.197, 2018/05/30 09:27:38
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.1.25    RPL/2 (R) version 4.1.29
   Copyright (C) 1989-2016 Dr. BERTRAND Joël    Copyright (C) 1989-2018 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 65  thread_surveillance_signaux(void *argume Line 65  thread_surveillance_signaux(void *argume
 {  {
     // Cette fonction est lancée dans un thread créé par processus pour      // Cette fonction est lancée dans un thread créé par processus pour
     // gérer le cas des appels système qui seraient bloqués lors de l'arrivée du      // gérer le cas des appels système qui seraient bloqués lors de l'arrivée du
     // signal SIGALRM. Les processus externes n'envoient plus un signal au      // signal SIGUSR2. Les processus externes n'envoient plus un signal au
     // processus ou au thread à signaler mais positionnent les informations      // processus ou au thread à signaler mais positionnent les informations
     // nécessaires dans la queue des signaux et incrémentent le sémaphore.      // nécessaires dans la queue des signaux et incrémentent le sémaphore.
     // Le sémaphore est décrémenté lorsque le signal est effectivement traité.      // Le sémaphore est décrémenté lorsque le signal est effectivement traité.
Line 135  thread_surveillance_signaux(void *argume Line 135  thread_surveillance_signaux(void *argume
                 // appels système lents.                  // appels système lents.
   
                 nombre_signaux_envoyes++;                  nombre_signaux_envoyes++;
                 kill(getpid(), SIGALRM);                  kill(getpid(), SIGUSR2);
                 sched_yield();                  sched_yield();
             }              }
   
Line 168  thread_surveillance_signaux(void *argume Line 168  thread_surveillance_signaux(void *argume
                     {                      {
                         nombre_signaux_envoyes++;                          nombre_signaux_envoyes++;
                         pthread_kill((*((struct_thread *)                          pthread_kill((*((struct_thread *)
                                 (*l_element_courant).donnee)).tid, SIGALRM);                                  (*l_element_courant).donnee)).tid, SIGUSR2);
                         sched_yield();                          sched_yield();
                     }                      }
   
Line 1629  thread_signaux(void *argument) Line 1629  thread_signaux(void *argument)
         if (signal != (0xFF & rpl_sigmax))          if (signal != (0xFF & rpl_sigmax))
         {          {
             envoi_signal_processus(getpid(), signal, d_faux);              envoi_signal_processus(getpid(), signal, d_faux);
             // Un signal SIGALRM est envoyé par le thread de surveillance              // Un signal SIGUSR2 est envoyé par le thread de surveillance
             // des signaux jusqu'à ce que les signaux soient tous traités.              // des signaux jusqu'à ce que les signaux soient tous traités.
         }          }
     } while(signal != (0xFF & rpl_sigmax));      } while(signal != (0xFF & rpl_sigmax));
Line 1685  interruption1(int signal) Line 1685  interruption1(int signal)
             break;              break;
   
         default:          default:
             // SIGALRM              // SIGUSR2
             break;              break;
     }      }
   
Line 2028  sortie_interruption_depassement_pile(voi Line 2028  sortie_interruption_depassement_pile(voi
     return;      return;
 }  }
   
   #ifdef HAVE_SIGSEGV_RECOVERY
 void  void
 interruption_depassement_pile(int urgence, stackoverflow_context_t scp)  interruption_depassement_pile(int urgence, stackoverflow_context_t scp)
 {  {
Line 2044  interruption_depassement_pile(int urgenc Line 2045  interruption_depassement_pile(int urgenc
     interruption3(SIGUSR2);      interruption3(SIGUSR2);
     return;      return;
 }  }
   #endif
   
 int  int
 interruption_violation_access(void *adresse_fautive, int gravite)  interruption_violation_access(void *adresse_fautive, int gravite)
Line 2057  interruption_violation_access(void *adre Line 2059  interruption_violation_access(void *adre
     {      {
         // Il peut s'agir d'un dépassement de pile.          // Il peut s'agir d'un dépassement de pile.
   
         sigsegv_leave_handler(sortie_interruption_depassement_pile,  #       ifdef HAVE_SIGSEGV_RECOVERY
                 (void *) &routine_recursive, NULL, NULL);              sigsegv_leave_handler(sortie_interruption_depassement_pile,
                       (void *) &routine_recursive, NULL, NULL);
   #       else
               sortie_interruption_depassement_pile((void *) &routine_recursive,
                       NULL, NULL);
   #       endif
     }      }
   
     // On est dans une bonne vieille violation d'accès. On essaie      // On est dans une bonne vieille violation d'accès. On essaie
Line 3410  creation_queue_signaux(struct_processus Line 3417  creation_queue_signaux(struct_processus
 #       endif  #       endif
 #   endif  #   endif
   
       (*s_queue_signaux).controle = getpid();
   
       if (lancement_thread_signaux(s_etat_processus) == d_erreur)
       {
           (*s_etat_processus).erreur_systeme = d_es_processus;
           return;
       }
   
     // Lancement du thread de récupération des signaux.      // Lancement du thread de récupération des signaux.
   
     if (pthread_attr_init(&attributs) != 0)      if (pthread_attr_init(&attributs) != 0)
Line 3425  creation_queue_signaux(struct_processus Line 3440  creation_queue_signaux(struct_processus
         return;          return;
     }      }
   
     (*s_queue_signaux).controle = getpid();  
   
     if (pthread_create(&((*s_queue_signaux).thread_signaux), &attributs,      if (pthread_create(&((*s_queue_signaux).thread_signaux), &attributs,
             thread_surveillance_signaux, s_etat_processus) != 0)              thread_surveillance_signaux, s_etat_processus) != 0)
     {      {
Line 3447  creation_queue_signaux(struct_processus Line 3460  creation_queue_signaux(struct_processus
         (*s_etat_processus).erreur_systeme = d_es_processus;          (*s_etat_processus).erreur_systeme = d_es_processus;
         return;          return;
     }      }
 #           endif  #   endif
   
     if (lancement_thread_signaux(s_etat_processus) == d_erreur)  
     {  
         (*s_etat_processus).erreur_systeme = d_es_processus;  
         return;  
     }  
   
     return;      return;
 }  }
Line 3522  destruction_queue_signaux(struct_process Line 3529  destruction_queue_signaux(struct_process
         unsigned char       *nom;          unsigned char       *nom;
 #   endif  #   endif
   
     // On dépile les interruptions pour arrêter les SIGALRM sur      // On dépile les interruptions pour arrêter les SIGUSR2 sur
     // le processus courant.      // le processus courant.
   
     scrutation_interruptions(s_etat_processus);      scrutation_interruptions(s_etat_processus);

Removed from v.1.184  
changed lines
  Added in v.1.197


CVSweb interface <joel.bertrand@systella.fr>