Diff for /rpl/src/instructions_d5.c between versions 1.66 and 1.67

version 1.66, 2011/09/10 20:45:06 version 1.67, 2011/09/14 14:34:28
Line 829  instruction_detach(struct_processus *s_e Line 829  instruction_detach(struct_processus *s_e
     sig_atomic_t                registre_stop;      sig_atomic_t                registre_stop;
   
     sigset_t                    oldset;      sigset_t                    oldset;
     sigset_t                    oldset2;  
     sigset_t                    set;      sigset_t                    set;
     sigset_t                    set2;  
   
     ssize_t                     longueur_ecriture;      ssize_t                     longueur_ecriture;
   
Line 1033  instruction_detach(struct_processus *s_e Line 1031  instruction_detach(struct_processus *s_e
         }          }
     }      }
   
     if (sigemptyset(&set) != 0)  
     {  
         (*s_etat_processus).erreur_systeme = d_es_processus;  
         return;  
     }  
   
     if (sigaddset(&set, SIGSTART) != 0)  
     {  
         (*s_etat_processus).erreur_systeme = d_es_processus;  
         return;  
     }  
   
     /*  
      * Le signal SIGFSTOP doit être traité !  
      */  
   
     if (sigaddset(&set, SIGFSTOP) != 0)  
     {  
         (*s_etat_processus).erreur_systeme = d_es_processus;  
         return;  
     }  
   
     if (sigaddset(&set, SIGFABORT) != 0)  
     {  
         (*s_etat_processus).erreur_systeme = d_es_processus;  
         return;  
     }  
   
     if (sigaddset(&set, SIGURG) != 0)  
     {  
         (*s_etat_processus).erreur_systeme = d_es_processus;  
         return;  
     }  
   
     if (pthread_sigmask(SIG_BLOCK, &set, &oldset) != 0)  
     {  
         (*s_etat_processus).erreur_systeme = d_es_processus;  
         return;  
     }  
   
     if ((s_argument_thread = malloc(sizeof(struct_descripteur_thread))) == NULL)      if ((s_argument_thread = malloc(sizeof(struct_descripteur_thread))) == NULL)
     {      {
         (*s_etat_processus).erreur_systeme = d_es_processus;          (*s_etat_processus).erreur_systeme = d_es_processus;
Line 1146  instruction_detach(struct_processus *s_e Line 1104  instruction_detach(struct_processus *s_e
      * de mémoire, ni libération, ni copie d'objet concurrent au fork().       * de mémoire, ni libération, ni copie d'objet concurrent au fork().
      */       */
   
     sigfillset(&set2);      sigfillset(&set);
     pthread_sigmask(SIG_BLOCK, &set2, &oldset2);      pthread_sigmask(SIG_BLOCK, &set, &oldset);
   
     verrouillage_threads_concurrents(s_etat_processus);      verrouillage_threads_concurrents(s_etat_processus);
     (*s_argument_thread).pid = fork();      (*s_argument_thread).pid = fork();
     deverrouillage_threads_concurrents(s_etat_processus);      deverrouillage_threads_concurrents(s_etat_processus);
       pthread_sigmask(SIG_SETMASK, &oldset, NULL);
     pthread_sigmask(SIG_SETMASK, &oldset2, NULL);      sigpending(&set);
     sigpending(&set2);  
   
     (*s_argument_thread).thread_pere = pthread_self();      (*s_argument_thread).thread_pere = pthread_self();
     (*s_argument_thread).processus_detache = d_vrai;      (*s_argument_thread).processus_detache = d_vrai;
Line 1317  instruction_detach(struct_processus *s_e Line 1273  instruction_detach(struct_processus *s_e
          * Processus fils           * Processus fils
          */           */
   
 #       ifdef _BROKEN_SIGINFO          liberation_queue_signaux(s_etat_processus);
         liberation_fifos_signaux(s_etat_processus);          creation_queue_signaux(s_etat_processus);
         creation_fifos_signaux(s_etat_processus);  
 #       endif  
   
         (*s_etat_processus).signal_a_traiter = d_faux;          (*s_etat_processus).pointeur_signal_lecture = 0;
           (*s_etat_processus).pointeur_signal_ecriture = 0;
           (*s_etat_processus).tid_courant = pthread_self();
   
         if ((*s_etat_processus).debug == d_vrai)          if ((*s_etat_processus).debug == d_vrai)
             if (((*s_etat_processus).type_debug &              if (((*s_etat_processus).type_debug &
Line 1513  instruction_detach(struct_processus *s_e Line 1469  instruction_detach(struct_processus *s_e
                 }                  }
             }              }
   
 #           ifdef _BROKEN_SIGINFO              destruction_queue_signaux(s_etat_processus);
             destruction_fifos_signaux(s_etat_processus);  
 #           endif  
   
             BUG(1, uprintf("Process management error line %d\n", __LINE__));              BUG(1, uprintf("Process management error line %d\n", __LINE__));
             exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
         }          }
Line 1547  instruction_detach(struct_processus *s_e Line 1500  instruction_detach(struct_processus *s_e
                 }                  }
             }              }
   
 #           ifdef _BROKEN_SIGINFO              destruction_queue_signaux(s_etat_processus);
             destruction_fifos_signaux(s_etat_processus);  
 #           endif  
   
             BUG(1, uprintf("Process management error line %d\n", __LINE__));              BUG(1, uprintf("Process management error line %d\n", __LINE__));
             exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
         }          }
Line 1584  instruction_detach(struct_processus *s_e Line 1534  instruction_detach(struct_processus *s_e
                 }                  }
             }              }
   
 #           ifdef _BROKEN_SIGINFO              destruction_queue_signaux(s_etat_processus);
             destruction_fifos_signaux(s_etat_processus);  
 #           endif  
   
             BUG(1, uprintf("Process management error line %d\n", __LINE__));              BUG(1, uprintf("Process management error line %d\n", __LINE__));
             exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
         }          }
Line 1646  instruction_detach(struct_processus *s_e Line 1593  instruction_detach(struct_processus *s_e
          * renseignée.           * renseignée.
          */           */
   
         if (sigpending(&set) != 0)          // Attente de la réception du signal rpl_sigstart.
         {  
             (*s_etat_processus).erreur_systeme = d_es_processus;          for((*s_etat_processus).demarrage_fils = d_faux;;)
         }  
         else if (sigismember(&set, SIGSTART) == 0)  
         {          {
             while(sigismember(&set, SIGSTART) == 0)              scrutation_interruptions(s_etat_processus);
             {  
                 if (sigpending(&set) != 0)  
                 {  
                     (*s_etat_processus).erreur_systeme = d_es_processus;  
                 }  
   
                 nanosleep(&attente, NULL);              if ((*s_etat_processus).demarrage_fils == d_vrai)
               {
                   break;
             }              }
   
               nanosleep(&attente, NULL);
         }          }
   
         (*s_etat_processus).niveau_initial = (*s_etat_processus).niveau_courant;          (*s_etat_processus).niveau_initial = (*s_etat_processus).niveau_courant;
Line 1737  instruction_detach(struct_processus *s_e Line 1681  instruction_detach(struct_processus *s_e
                 }                  }
             }              }
   
 #           ifdef _BROKEN_SIGINFO              destruction_queue_signaux(s_etat_processus);
             destruction_fifos_signaux(s_etat_processus);  
 #           endif  
   
             BUG(1, uprintf("Process management error line %d\n", __LINE__));              BUG(1, uprintf("Process management error line %d\n", __LINE__));
             exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
         }          }
Line 1757  instruction_detach(struct_processus *s_e Line 1698  instruction_detach(struct_processus *s_e
             (*s_argument_thread2).nombre_references--;              (*s_argument_thread2).nombre_references--;
   
             BUG((*s_argument_thread2).nombre_references < 0,              BUG((*s_argument_thread2).nombre_references < 0,
 #                   ifdef _BROKEN_SIGINFO                      destruction_queue_signaux(s_etat_processus),
                     destruction_fifos_signaux(s_etat_processus),  
 #                   endif  
                     printf("(*s_argument_thread2).nombre_references = %d\n",                      printf("(*s_argument_thread2).nombre_references = %d\n",
                     (int) (*s_argument_thread2).nombre_references));                      (int) (*s_argument_thread2).nombre_references));
   
Line 1823  instruction_detach(struct_processus *s_e Line 1762  instruction_detach(struct_processus *s_e
                 }                  }
             }              }
   
 #           ifdef _BROKEN_SIGINFO              destruction_queue_signaux(s_etat_processus);
             destruction_fifos_signaux(s_etat_processus);  
 #           endif  
   
             BUG(1, uprintf("Process management error line %d\n", __LINE__));              BUG(1, uprintf("Process management error line %d\n", __LINE__));
             exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
         }          }
Line 1891  instruction_detach(struct_processus *s_e Line 1827  instruction_detach(struct_processus *s_e
                 }                  }
             }              }
   
 #           ifdef _BROKEN_SIGINFO              destruction_queue_signaux(s_etat_processus);
             destruction_fifos_signaux(s_etat_processus);  
 #           endif  
   
             BUG(1, uprintf("Process management error line %d\n", __LINE__));              BUG(1, uprintf("Process management error line %d\n", __LINE__));
             exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
         }          }
Line 1947  instruction_detach(struct_processus *s_e Line 1880  instruction_detach(struct_processus *s_e
                 }                  }
             }              }
   
 #           ifdef _BROKEN_SIGINFO              destruction_queue_signaux(s_etat_processus);
             destruction_fifos_signaux(s_etat_processus);  
 #           endif  
   
             BUG(1, uprintf("Process management error line %d\n", __LINE__));              BUG(1, uprintf("Process management error line %d\n", __LINE__));
             exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
         }          }
Line 2051  instruction_detach(struct_processus *s_e Line 1981  instruction_detach(struct_processus *s_e
   
         (*s_etat_processus).s_fichiers = NULL;          (*s_etat_processus).s_fichiers = NULL;
   
         if (pthread_sigmask(SIG_SETMASK, &oldset, NULL) != 0)  
         {  
             (*s_etat_processus).erreur_systeme = d_es_processus;  
         }  
   
         sigpending(&set);  
   
         if ((*s_etat_processus).debug == d_vrai)          if ((*s_etat_processus).debug == d_vrai)
         {          {
             if (((*s_etat_processus).type_debug & d_debug_processus)              if (((*s_etat_processus).type_debug & d_debug_processus)
Line 2362  instruction_detach(struct_processus *s_e Line 2285  instruction_detach(struct_processus *s_e
   
                 if ((*s_etat_processus).var_volatile_alarme != 0)                  if ((*s_etat_processus).var_volatile_alarme != 0)
                 {                  {
                     kill((*(*((struct_processus_fils *)                      envoi_signal_processus((*(*((struct_processus_fils *)
                             (*(*l_element_courant).donnee).objet)).thread).pid,                              (*(*l_element_courant).donnee).objet)).thread).pid,
                             SIGURG);                              rpl_sigurg);
                 }                  }
                 else                  else
                 {                  {
                     if ((*s_etat_processus).arret_depuis_abort == -1)                      if ((*s_etat_processus).arret_depuis_abort == -1)
                     {                      {
                         kill((*(*((struct_processus_fils *)                          envoi_signal_processus((*(*((struct_processus_fils *)
                                 (*(*l_element_courant).donnee).objet)).thread)                                  (*(*l_element_courant).donnee).objet)).thread)
                                 .pid, SIGFABORT);                                  .pid, rpl_sigabort);
                     }                      }
                     else                      else
                     {                      {
                         kill((*(*((struct_processus_fils *)                          envoi_signal_processus((*(*((struct_processus_fils *)
                                 (*(*l_element_courant).donnee).objet)).thread)                                  (*(*l_element_courant).donnee).objet)).thread)
                                 .pid, SIGFSTOP);                                  .pid, rpl_sigstop);
                     }                      }
                 }                  }
             }              }
Line 2420  instruction_detach(struct_processus *s_e Line 2343  instruction_detach(struct_processus *s_e
                 {                  {
                     if ((*s_etat_processus).var_volatile_alarme != 0)                      if ((*s_etat_processus).var_volatile_alarme != 0)
                     {                      {
                         pthread_kill((*(*((struct_processus_fils *)                          envoi_signal_thread((*(*((struct_processus_fils *)
                                 (*(*l_element_courant).donnee).objet)).thread)                                  (*(*l_element_courant).donnee).objet)).thread)
                                 .tid, SIGURG);                                  .tid, rpl_sigurg);
                     }                      }
                     else                      else
                     {                      {
                         if ((*s_etat_processus).arret_depuis_abort == -1)                          if ((*s_etat_processus).arret_depuis_abort == -1)
                         {                          {
                             pthread_kill((*(*((struct_processus_fils *)                              envoi_signal_thread((*(*((struct_processus_fils *)
                                     (*(*l_element_courant).donnee).objet))                                      (*(*l_element_courant).donnee).objet))
                                     .thread).tid, SIGFABORT);                                      .thread).tid, rpl_sigabort);
                         }                          }
                         else                          else
                         {                          {
                             pthread_kill((*(*((struct_processus_fils *)                              envoi_signal_thread((*(*((struct_processus_fils *)
                                     (*(*l_element_courant).donnee).objet))                                      (*(*l_element_courant).donnee).objet))
                                     .thread).tid, SIGFSTOP);                                      .thread).tid, rpl_sigstop);
                         }                          }
                     }                      }
                 }                  }
Line 2502  instruction_detach(struct_processus *s_e Line 2425  instruction_detach(struct_processus *s_e
                                     registre_stop;                                      registre_stop;
                         }                          }
   
 #                       ifdef _BROKEN_SIGINFO                          destruction_queue_signaux(s_etat_processus);
                         destruction_fifos_signaux(s_etat_processus);  
 #                       endif  
   
                         (*s_etat_processus).erreur_systeme = d_es_signal;                          (*s_etat_processus).erreur_systeme = d_es_signal;
                         exit(EXIT_FAILURE);                          exit(EXIT_FAILURE);
                     }                      }
Line 2540  instruction_detach(struct_processus *s_e Line 2460  instruction_detach(struct_processus *s_e
   
                     if (sigaction(SIGPIPE, &registre, NULL) != 0)                      if (sigaction(SIGPIPE, &registre, NULL) != 0)
                     {                      {
 #                       ifdef _BROKEN_SIGINFO                          destruction_queue_signaux(s_etat_processus);
                         destruction_fifos_signaux(s_etat_processus);  
 #                       endif  
   
                         pthread_mutex_unlock(&((*s_etat_processus).mutex));                          pthread_mutex_unlock(&((*s_etat_processus).mutex));
   
                         (*s_etat_processus).erreur_systeme = d_es_signal;                          (*s_etat_processus).erreur_systeme = d_es_signal;
                         exit(EXIT_FAILURE);                          exit(EXIT_FAILURE);
                     }                      }
Line 2926  instruction_detach(struct_processus *s_e Line 2843  instruction_detach(struct_processus *s_e
   
         clear_history();          clear_history();
   
 #       ifdef _BROKEN_SIGINFO          destruction_queue_signaux(s_etat_processus);
         destruction_fifos_signaux(s_etat_processus);  
 #       endif  
   
         liberation_contexte_cas(s_etat_processus);          liberation_contexte_cas(s_etat_processus);
         free(s_etat_processus);          free(s_etat_processus);
   
Line 3029  instruction_detach(struct_processus *s_e Line 2943  instruction_detach(struct_processus *s_e
   
     // Le fils peut être présent sans être en attente du signal de départ.      // Le fils peut être présent sans être en attente du signal de départ.
   
     if (kill((*s_argument_thread).pid, SIGSTART) != 0)      if (envoi_signal_processus((*s_argument_thread).pid, rpl_sigstart) != 0)
     {      {
         (*s_etat_processus).erreur_systeme = d_es_processus;          (*s_etat_processus).erreur_systeme = d_es_processus;
         pthread_mutex_unlock(&((*s_etat_processus).mutex));          pthread_mutex_unlock(&((*s_etat_processus).mutex));
         return;          return;
     }      }
   
     if (pthread_sigmask(SIG_SETMASK, &oldset, NULL) != 0)  
     {  
         (*s_etat_processus).erreur_systeme = d_es_processus;  
         pthread_mutex_unlock(&((*s_etat_processus).mutex));  
         return;  
     }  
   
     sigpending(&set);  
   
     if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)      if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
     {      {
         (*s_etat_processus).erreur_systeme = d_es_processus;          (*s_etat_processus).erreur_systeme = d_es_processus;

Removed from v.1.66  
changed lines
  Added in v.1.67


CVSweb interface <joel.bertrand@systella.fr>