Diff for /rpl/src/instructions_d5.c between versions 1.2 and 1.22

version 1.2, 2010/01/27 22:22:12 version 1.22, 2010/05/24 10:58:32
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.0.10    RPL/2 (R) version 4.0.16
   Copyright (C) 1989-2010 Dr. BERTRAND Joël    Copyright (C) 1989-2010 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
Line 1062  instruction_detach(struct_processus *s_e Line 1062  instruction_detach(struct_processus *s_e
         return;          return;
     }      }
   
       if (sigaddset(&set, SIGFABORT) != 0)
       {
           (*s_etat_processus).erreur_systeme = d_es_processus;
           return;
       }
   
     if (sigaddset(&set, SIGURG) != 0)      if (sigaddset(&set, SIGURG) != 0)
     {      {
         (*s_etat_processus).erreur_systeme = d_es_processus;          (*s_etat_processus).erreur_systeme = d_es_processus;
Line 1290  instruction_detach(struct_processus *s_e Line 1296  instruction_detach(struct_processus *s_e
          * Processus fils           * Processus fils
          */           */
   
   #       ifdef DEBUG_MEMOIRE
           debug_memoire_reinitialisation();
   #       endif
   
   #       ifndef SEMAPHORES_NOMMES
         sem_post(&semaphore_gestionnaires_signaux);          sem_post(&semaphore_gestionnaires_signaux);
         sem_destroy(&semaphore_gestionnaires_signaux);          sem_destroy(&semaphore_gestionnaires_signaux);
         sem_init(&semaphore_gestionnaires_signaux, 0, 0);          sem_init(&semaphore_gestionnaires_signaux, 0, 0);
   #       else
           sem_post(semaphore_gestionnaires_signaux);
           sem_destroy2(semaphore_gestionnaires_signaux,
                   sem_gestionnaires_signaux);
   
           if ((semaphore_gestionnaires_signaux = sem_init2(0,
                   sem_gestionnaires_signaux)) == SEM_FAILED)
           {
               (*s_etat_processus).erreur_systeme = d_es_processus;
           }
   #       endif
   
   #       ifndef SEMAPHORES_NOMMES
         sem_post(&semaphore_liste_threads);          sem_post(&semaphore_liste_threads);
         sem_destroy(&semaphore_liste_threads);          sem_destroy(&semaphore_liste_threads);
         sem_init(&semaphore_liste_threads, 0, 1);          sem_init(&semaphore_liste_threads, 0, 1);
   #       else
           sem_post(semaphore_liste_threads);
           sem_destroy2(semaphore_liste_threads, sem_liste_threads);
   
           if ((semaphore_liste_threads = sem_init2(1,
                   sem_liste_threads)) == SEM_FAILED)
           {
               (*s_etat_processus).erreur_systeme = d_es_processus;
           }
   #       endif
   
   #       ifndef SEMAPHORES_NOMMES
         sem_destroy(&semaphore_gestionnaires_signaux_atomique);          sem_destroy(&semaphore_gestionnaires_signaux_atomique);
         sem_init(&semaphore_gestionnaires_signaux_atomique, 0, 1);          sem_init(&semaphore_gestionnaires_signaux_atomique, 0, 1);
   
         sem_trywait(&((*s_etat_processus).semaphore_fork));          sem_trywait(&((*s_etat_processus).semaphore_fork));
   #       else
           sem_destroy2(semaphore_gestionnaires_signaux_atomique,
                   sem_gestionnaires_signaux_atomique);
   
           if ((semaphore_gestionnaires_signaux_atomique = sem_init2(1,
                   sem_gestionnaires_signaux_atomique)) == SEM_FAILED)
           {
               (*s_etat_processus).erreur_systeme = d_es_processus;
           }
   
           sem_trywait((*s_etat_processus).semaphore_fork);
   #       endif
   
   #       ifndef SEMAPHORES_NOMMES
         if (pthread_setspecific(semaphore_fork_processus_courant,          if (pthread_setspecific(semaphore_fork_processus_courant,
                 &((*s_etat_processus).semaphore_fork)) != 0)                  &((*s_etat_processus).semaphore_fork)) != 0)
   #       else
           if (pthread_setspecific(semaphore_fork_processus_courant,
                   (*s_etat_processus).semaphore_fork) != 0)
   #       endif
         {          {
             (*s_etat_processus).erreur_systeme = d_es_processus;              (*s_etat_processus).erreur_systeme = d_es_processus;
         }          }
Line 1482  instruction_detach(struct_processus *s_e Line 1532  instruction_detach(struct_processus *s_e
         (*s_etat_processus).nombre_interruptions_non_affectees = 0;          (*s_etat_processus).nombre_interruptions_non_affectees = 0;
         (*s_etat_processus).processus_detache = d_vrai;          (*s_etat_processus).processus_detache = d_vrai;
   
           liberation(s_etat_processus, (*s_etat_processus).at_exit);
           (*s_etat_processus).at_exit = NULL;
   
         for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++)          for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++)
         {          {
             liberation(s_etat_processus,              liberation(s_etat_processus,
Line 1760  instruction_detach(struct_processus *s_e Line 1813  instruction_detach(struct_processus *s_e
             l_element_suivant = (*l_element_courant).suivant;              l_element_suivant = (*l_element_courant).suivant;
   
             fclose((*((struct_descripteur_fichier *)              fclose((*((struct_descripteur_fichier *)
                     (*l_element_courant).donnee)).descripteur);                      (*l_element_courant).donnee)).descripteur_c);
   
               if ((*((struct_descripteur_fichier *)
                       (*l_element_courant).donnee)).type != 'C')
               {
                   sqlite3_close((*((struct_descripteur_fichier *)
                           (*l_element_courant).donnee)).descripteur_sqlite);
               }
   
             free((*((struct_descripteur_fichier *) (*l_element_courant)              free((*((struct_descripteur_fichier *) (*l_element_courant)
                     .donnee)).nom);                      .donnee)).nom);
Line 1774  instruction_detach(struct_processus *s_e Line 1834  instruction_detach(struct_processus *s_e
          * Destruction des piles de connecteurs SQL           * Destruction des piles de connecteurs SQL
          */           */
   
   /*
   ================================================================================
     À noter : on ne ferme pas la connexion car la conséquence immédiate est
     une destruction de l'objet pour le processus père.
   ================================================================================
   
         l_element_courant = (*s_etat_processus).s_connecteurs_sql;          l_element_courant = (*s_etat_processus).s_connecteurs_sql;
   
         while(l_element_courant != NULL)          while(l_element_courant != NULL)
Line 1784  instruction_detach(struct_processus *s_e Line 1850  instruction_detach(struct_processus *s_e
             liberation(s_etat_processus, (*l_element_courant).donnee);              liberation(s_etat_processus, (*l_element_courant).donnee);
             l_element_courant = l_element_suivant;              l_element_courant = l_element_suivant;
         }          }
   */
   
           (*s_etat_processus).s_connecteurs_sql = NULL;
   
         /*          /*
          * On ne détruit pas les sockets car il faut utiliser DETACH           * On ne détruit pas les sockets car il faut utiliser DETACH
Line 1812  instruction_detach(struct_processus *s_e Line 1881  instruction_detach(struct_processus *s_e
                                 d_ex_erreur_evaluation;                                  d_ex_erreur_evaluation;
                     }                      }
                 }                  }
                   else
                   {
                       if (((*s_etat_processus).var_volatile_alarme == 0)
                               && ((*s_etat_processus).arret_depuis_abort == 0)
                               && ((*s_etat_processus).at_exit != NULL))
                       {
                           (*s_etat_processus).var_volatile_requete_arret = 0;
   
                           if (evaluation(s_etat_processus,
                                   (*s_etat_processus).at_exit, 'E') == d_erreur)
                           {
                               (*s_etat_processus).erreur_execution =
                                       d_ex_erreur_evaluation;
                           }
                       }
                   }
             }              }
             else              else
             {              {
Line 1824  instruction_detach(struct_processus *s_e Line 1909  instruction_detach(struct_processus *s_e
                                 d_ex_erreur_evaluation;                                  d_ex_erreur_evaluation;
                     }                      }
                 }                  }
                   else
                   {
                       if ((*s_etat_processus).at_exit != NULL)
                       {
                           (*s_etat_processus).var_volatile_requete_arret = 0;
   
                           if (evaluation(s_etat_processus,
                                   (*s_etat_processus).at_exit, 'E') == d_erreur)
                           {
                               (*s_etat_processus).erreur_execution =
                                       d_ex_erreur_evaluation;
                           }
                       }
                   }
   
                 liberation(s_etat_processus, s_copie);                  liberation(s_etat_processus, s_copie);
             }              }
         }          }
   
           liberation(s_etat_processus, (*s_etat_processus).at_exit);
   
         l_element_courant = (*s_etat_processus).liste_mutexes;          l_element_courant = (*s_etat_processus).liste_mutexes;
         while(l_element_courant != NULL)          while(l_element_courant != NULL)
         {          {
Line 1979  instruction_detach(struct_processus *s_e Line 2080  instruction_detach(struct_processus *s_e
             l_element_suivant = (*l_element_courant).suivant;              l_element_suivant = (*l_element_courant).suivant;
   
             fclose((*((struct_descripteur_fichier *)              fclose((*((struct_descripteur_fichier *)
                     (*l_element_courant).donnee)).descripteur);                      (*l_element_courant).donnee)).descripteur_c);
   
               if ((*((struct_descripteur_fichier *)
                       (*l_element_courant).donnee)).type != 'C')
               {
                   sqlite3_close((*((struct_descripteur_fichier *)
                           (*l_element_courant).donnee)).descripteur_sqlite);
               }
   
             if (((*((struct_descripteur_fichier *) (*l_element_courant)              if (((*((struct_descripteur_fichier *) (*l_element_courant)
                     .donnee)).pid == getpid()) &&                      .donnee)).pid == getpid()) &&
Line 2048  instruction_detach(struct_processus *s_e Line 2156  instruction_detach(struct_processus *s_e
                 }                  }
                 else                  else
                 {                  {
                     kill((*(*((struct_processus_fils *)                      if ((*s_etat_processus).arret_depuis_abort == -1)
                             (*(*l_element_courant).donnee).objet)).thread).pid,                      {
                             SIGFSTOP);                          kill((*(*((struct_processus_fils *)
                                   (*(*l_element_courant).donnee).objet)).thread)
                                   .pid, SIGFABORT);
                       }
                       else
                       {
                           kill((*(*((struct_processus_fils *)
                                   (*(*l_element_courant).donnee).objet)).thread)
                                   .pid, SIGFSTOP);
                       }
                 }                  }
             }              }
             else              else
Line 2097  instruction_detach(struct_processus *s_e Line 2214  instruction_detach(struct_processus *s_e
                     }                      }
                     else                      else
                     {                      {
                         pthread_kill((*(*((struct_processus_fils *)                          if ((*s_etat_processus).arret_depuis_abort == -1)
                                 (*(*l_element_courant).donnee).objet)).thread)                          {
                                 .tid, SIGFSTOP);                              pthread_kill((*(*((struct_processus_fils *)
                                       (*(*l_element_courant).donnee).objet))
                                       .thread).tid, SIGFABORT);
                           }
                           else
                           {
                               pthread_kill((*(*((struct_processus_fils *)
                                       (*(*l_element_courant).donnee).objet))
                                       .thread).tid, SIGFSTOP);
                           }
                     }                      }
                 }                  }
   
Line 2127  instruction_detach(struct_processus *s_e Line 2253  instruction_detach(struct_processus *s_e
             l_element_courant = (struct_liste_chainee *)              l_element_courant = (struct_liste_chainee *)
                     (*s_etat_processus).l_base_pile_processus;                      (*s_etat_processus).l_base_pile_processus;
   
             if ((*s_etat_processus).nombre_interruptions_non_affectees != 0)  
             {  
                 affectation_interruptions_logicielles(s_etat_processus);  
             }  
   
             registre_stop = (*s_etat_processus)              registre_stop = (*s_etat_processus)
                     .var_volatile_traitement_retarde_stop;                      .var_volatile_traitement_retarde_stop;
             (*s_etat_processus).var_volatile_traitement_retarde_stop = 1;              (*s_etat_processus).var_volatile_traitement_retarde_stop = 1;
Line 2214  instruction_detach(struct_processus *s_e Line 2335  instruction_detach(struct_processus *s_e
             }              }
   
             pthread_mutex_unlock(&((*s_etat_processus).mutex));              pthread_mutex_unlock(&((*s_etat_processus).mutex));
   
               if ((*s_etat_processus).nombre_interruptions_non_affectees != 0)
               {
                   affectation_interruptions_logicielles(s_etat_processus);
               }
   
             nanosleep(&attente, NULL);              nanosleep(&attente, NULL);
             pthread_mutex_lock(&((*s_etat_processus).mutex));              pthread_mutex_lock(&((*s_etat_processus).mutex));
         }          }
Line 2515  instruction_detach(struct_processus *s_e Line 2642  instruction_detach(struct_processus *s_e
   
         liberation(s_etat_processus, s_objet);          liberation(s_etat_processus, s_objet);
   
   #       ifndef Cygwin
           (*s_etat_processus).pile_signal.ss_flags = SS_DISABLE;
           sigaltstack(&((*s_etat_processus).pile_signal), NULL);
         free((*s_etat_processus).pile_signal.ss_sp);          free((*s_etat_processus).pile_signal.ss_sp);
         free((*s_etat_processus).definitions_chainees);  #       endif
   
           free((*s_etat_processus).definitions_chainees);
         free((*s_etat_processus).nom_fichier_historique);          free((*s_etat_processus).nom_fichier_historique);
   
         for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++)          for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++)
Line 2560  instruction_detach(struct_processus *s_e Line 2691  instruction_detach(struct_processus *s_e
   
         pthread_key_delete(semaphore_fork_processus_courant);          pthread_key_delete(semaphore_fork_processus_courant);
   
   #       ifndef SEMAPHORES_NOMMES
         sem_post(&((*s_etat_processus).semaphore_fork));          sem_post(&((*s_etat_processus).semaphore_fork));
         sem_destroy(&((*s_etat_processus).semaphore_fork));          sem_destroy(&((*s_etat_processus).semaphore_fork));
   #       else
           sem_post((*s_etat_processus).semaphore_fork);
           sem_destroy2((*s_etat_processus).semaphore_fork, sem_fork);
   #       endif
   
         free((*s_etat_processus).localisation);          free((*s_etat_processus).localisation);
         free(s_etat_processus);  
         free(s_argument_thread);          free(s_argument_thread);
   
   #       ifndef SEMAPHORES_NOMMES
         sem_destroy(&semaphore_liste_threads);          sem_destroy(&semaphore_liste_threads);
         sem_post(&semaphore_gestionnaires_signaux);          sem_post(&semaphore_gestionnaires_signaux);
         sem_destroy(&semaphore_gestionnaires_signaux);          sem_destroy(&semaphore_gestionnaires_signaux);
         sem_destroy(&semaphore_gestionnaires_signaux_atomique);          sem_destroy(&semaphore_gestionnaires_signaux_atomique);
   #       else
           sem_destroy2(semaphore_liste_threads, sem_liste_threads);
           sem_post(semaphore_gestionnaires_signaux);
           sem_destroy2(semaphore_gestionnaires_signaux,
                   sem_gestionnaires_signaux);
           sem_destroy2(semaphore_gestionnaires_signaux_atomique,
                   sem_gestionnaires_signaux_atomique);
   #       endif
   
         clear_history();          clear_history();
   
           free(s_etat_processus);
   
   #       ifdef DEBUG_MEMOIRE
           debug_memoire_verification();
           analyse_post_mortem();
   #       endif
   
         exit(EXIT_SUCCESS);          exit(EXIT_SUCCESS);
     }      }
     else      else

Removed from v.1.2  
changed lines
  Added in v.1.22


CVSweb interface <joel.bertrand@systella.fr>