Diff for /rpl/src/interruptions.c between versions 1.87 and 1.95

version 1.87, 2011/11/26 10:01:32 version 1.95, 2012/05/16 14:45:25
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.1.5    RPL/2 (R) version 4.1.8
   Copyright (C) 1989-2011 Dr. BERTRAND Joël    Copyright (C) 1989-2012 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 64  unsigned char         *racine_segment; Line 64  unsigned char         *racine_segment;
 static pthread_mutex_t                          mutex_interruptions  static pthread_mutex_t                          mutex_interruptions
         = PTHREAD_MUTEX_INITIALIZER;          = PTHREAD_MUTEX_INITIALIZER;
   
   void *
   thread_surveillance_signaux(void *argument)
   {
       // Chaque kill() ou pthread_kill() incrémente le sémaphore. Lorsque le
       // sémaphore est déverrouillé, on part dans un timeout.
       // while(sem_wait())
       // {
       //  nanosleep();
       //  if (errno == EINTR)
       //  {
       //      continue;
       //  }
       //
       //  if (sem_trywait() != 0)
       //  {
       //    sem_post()
       //    kill()
       //  }
       // }
       pthread_exit(NULL);
   }
   
 void  void
 modification_pid_thread_pere(struct_processus *s_etat_processus)  modification_pid_thread_pere(struct_processus *s_etat_processus)
 {  {
Line 1772  interruption3(int signal) Line 1794  interruption3(int signal)
         kill(pid_processus_pere, SIGUSR1);          kill(pid_processus_pere, SIGUSR1);
     }      }
   
   
     if (signal != SIGUSR2)      if (signal != SIGUSR2)
     {      {
         write(STDERR_FILENO, message_1, strlen(message_1));          write(STDERR_FILENO, message_1, strlen(message_1));
Line 1935  signal_stop(struct_processus *s_etat_pro Line 1956  signal_stop(struct_processus *s_etat_pro
   
     if (pid == getpid())      if (pid == getpid())
     {      {
         if ((s_etat_processus = recherche_thread(getpid(), pthread_self()))  
                 == NULL)  
         {  
             deverrouillage_gestionnaire_signaux(s_etat_processus);  
             return;  
         }  
   
         if (((*s_etat_processus).type_debug & d_debug_signaux) != 0)          if (((*s_etat_processus).type_debug & d_debug_signaux) != 0)
         {          {
             printf("[%d] RPL/SIGSTOP (thread %llu)\n", (int) getpid(),              printf("[%d] RPL/SIGSTOP (thread %llu)\n", (int) getpid(),
Line 2033  signal_urg(struct_processus *s_etat_proc Line 2047  signal_urg(struct_processus *s_etat_proc
   
     if (pid == getpid())      if (pid == getpid())
     {      {
         if ((s_etat_processus = recherche_thread(getpid(), pthread_self()))  
                 == NULL)  
         {  
             deverrouillage_gestionnaire_signaux(s_etat_processus);  
             return;  
         }  
   
         if (((*s_etat_processus).type_debug & d_debug_signaux) != 0)          if (((*s_etat_processus).type_debug & d_debug_signaux) != 0)
         {          {
             printf("[%d] RPL/SIGURG (thread %llu)\n", (int) getpid(),              printf("[%d] RPL/SIGURG (thread %llu)\n", (int) getpid(),
Line 2089  signal_abort(struct_processus *s_etat_pr Line 2096  signal_abort(struct_processus *s_etat_pr
   
     if (pid == getpid())      if (pid == getpid())
     {      {
         if ((s_etat_processus = recherche_thread(getpid(), pthread_self()))  
                 == NULL)  
         {  
             deverrouillage_gestionnaire_signaux(s_etat_processus);  
             return;  
         }  
   
         (*s_etat_processus).arret_depuis_abort = -1;          (*s_etat_processus).arret_depuis_abort = -1;
   
         /*          /*
Line 2296  scrutation_interruptions(struct_processu Line 2296  scrutation_interruptions(struct_processu
         if (sem_trywait(semaphore_queue_signaux) == 0)          if (sem_trywait(semaphore_queue_signaux) == 0)
 #   endif  #   endif
     {      {
         if ((*s_queue_signaux).pointeur_lecture !=          while((*s_queue_signaux).pointeur_lecture !=
                 (*s_queue_signaux).pointeur_ecriture)                  (*s_queue_signaux).pointeur_ecriture)
         {          {
             // Il y a un signal en attente dans le segment partagé. On le              // Il y a un signal en attente dans le segment partagé. On le
Line 2322  scrutation_interruptions(struct_processu Line 2322  scrutation_interruptions(struct_processu
   
     if (pthread_mutex_trylock(&mutex_interruptions) == 0)      if (pthread_mutex_trylock(&mutex_interruptions) == 0)
     {      {
         if ((*s_etat_processus).pointeur_signal_lecture !=          while((*s_etat_processus).pointeur_signal_lecture !=
                 (*s_etat_processus).pointeur_signal_ecriture)                  (*s_etat_processus).pointeur_signal_ecriture)
         {          {
             // Il y a un signal dans la queue du thread courant. On le traite.              // Il y a un signal dans la queue du thread courant. On le traite.
Line 2621  envoi_signal_processus(pid_t pid, enum s Line 2621  envoi_signal_processus(pid_t pid, enum s
 #       endif  #       endif
     }      }
   
       kill(pid, SIGALRM);
   
     return(0);      return(0);
 }  }
   
Line 2684  envoi_signal_thread(pthread_t tid, enum Line 2686  envoi_signal_thread(pthread_t tid, enum
         return(1);          return(1);
     }      }
   
       pthread_kill(tid, SIGALRM);
   
     return(0);      return(0);
 }  }
   
Line 2700  envoi_signal_contexte(struct_processus * Line 2704  envoi_signal_contexte(struct_processus *
             % LONGUEUR_QUEUE_SIGNAUX;              % LONGUEUR_QUEUE_SIGNAUX;
     pthread_mutex_unlock(&mutex_interruptions);      pthread_mutex_unlock(&mutex_interruptions);
   
       pthread_kill((*s_etat_processus_a_signaler).tid, SIGALRM);
   
     return(0);      return(0);
 }  }
   

Removed from v.1.87  
changed lines
  Added in v.1.95


CVSweb interface <joel.bertrand@systella.fr>