Diff for /rpl/src/instructions_d5.c between versions 1.12 and 1.32

version 1.12, 2010/04/27 15:53:36 version 1.32, 2010/07/31 10:34:17
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.0.15    RPL/2 (R) version 4.0.18
   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 838  instruction_detach(struct_processus *s_e Line 838  instruction_detach(struct_processus *s_e
     ssize_t                     longueur_ecriture;      ssize_t                     longueur_ecriture;
   
     struct_descripteur_thread   *s_argument_thread;      struct_descripteur_thread   *s_argument_thread;
       struct_descripteur_thread   *s_argument_thread2;
   
     struct_liste_chainee        *l_element_courant;      struct_liste_chainee        *l_element_courant;
     struct_liste_chainee        *l_element_precedent;      struct_liste_chainee        *l_element_precedent;
Line 1062  instruction_detach(struct_processus *s_e Line 1063  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 1176  instruction_detach(struct_processus *s_e Line 1183  instruction_detach(struct_processus *s_e
             liberation(s_etat_processus, s_copie);              liberation(s_etat_processus, s_copie);
         }          }
   
         if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)          liberation(s_etat_processus, s_objet);
   
           if ((s_objet = allocation(s_etat_processus, PRC)) == NULL)
         {          {
             (*s_etat_processus).erreur_systeme = d_es_processus;              (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
             return;              return;
         }          }
   
         if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)          (*((struct_processus_fils *) (*s_objet).objet)).thread =
                   s_argument_thread;
           (*(*((struct_processus_fils *) (*s_objet).objet)).thread)
                   .nombre_objets_dans_pipe = 0;
           (*(*((struct_processus_fils *) (*s_objet).objet)).thread)
                   .nombre_interruptions_dans_pipe = 0;
           (*(*((struct_processus_fils *) (*s_objet).objet)).thread)
                   .nombre_references = 1;
   
           /*
            * On copie l'objet plutôt que le pointeur car cet objet peut être
            * accédé depuis deux threads distincts et aboutir à un blocage lors
            * d'une copie.
            */
   
           if ((s_objet_systeme = copie_objet(s_etat_processus, s_objet, 'O'))
                   == NULL)
         {          {
             (*s_etat_processus).erreur_systeme = d_es_processus;              (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
             return;              return;
         }          }
   
Line 1290  instruction_detach(struct_processus *s_e Line 1315  instruction_detach(struct_processus *s_e
          * Processus fils           * Processus fils
          */           */
   
           if ((*s_etat_processus).debug == d_vrai)
               if (((*s_etat_processus).type_debug &
                       d_debug_processus) != 0)
           {
               if ((*s_etat_processus).langue == 'F')
               {
                   printf("[%d] Lancement du processus fils %d de %d\n",
                           (int) getpid(), (int) getpid(), (int) ppid);
               }
               else
               {
                   printf("[%d] Start child process %d from %d\n", (int) getpid(),
                           (int) getpid(), (int) ppid);
               }
   
               fflush(stdout);
           }
   
 #       ifndef SEMAPHORES_NOMMES  #       ifndef SEMAPHORES_NOMMES
         sem_post(&semaphore_gestionnaires_signaux);          sem_post(&semaphore_gestionnaires_signaux);
         sem_destroy(&semaphore_gestionnaires_signaux);          sem_destroy(&semaphore_gestionnaires_signaux);
Line 1383  instruction_detach(struct_processus *s_e Line 1426  instruction_detach(struct_processus *s_e
             (*s_etat_processus).erreur_systeme = d_es_processus;              (*s_etat_processus).erreur_systeme = d_es_processus;
         }          }
   
           if ((*s_etat_processus).debug == d_vrai)
               if (((*s_etat_processus).type_debug &
                       d_debug_processus) != 0)
           {
               if ((*s_etat_processus).langue == 'F')
               {
                   printf("[%d] Libération des objets du processus père\n",
                           (int) getpid());
               }
               else
               {
                   printf("[%d] Freeing parent process memory\n", getpid());
               }
   
               fflush(stdout);
           }
   
         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 1444  instruction_detach(struct_processus *s_e Line 1504  instruction_detach(struct_processus *s_e
                 }                  }
             }              }
   
               BUG(1, uprintf("Process management error line %d\n", __LINE__));
             exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
         }          }
   
Line 1473  instruction_detach(struct_processus *s_e Line 1534  instruction_detach(struct_processus *s_e
                 }                  }
             }              }
   
               BUG(1, uprintf("Process management error line %d\n", __LINE__));
             exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
         }          }
   
           pthread_mutex_trylock(&((*s_etat_processus).protection_liste_mutexes));
   
         if (pthread_mutex_unlock(&((*s_etat_processus)          if (pthread_mutex_unlock(&((*s_etat_processus)
                 .protection_liste_mutexes)) != 0)                  .protection_liste_mutexes)) != 0)
         {          {
Line 1503  instruction_detach(struct_processus *s_e Line 1567  instruction_detach(struct_processus *s_e
                 }                  }
             }              }
   
               BUG(1, uprintf("Process management error line %d\n", __LINE__));
             exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
         }          }
   
Line 1522  instruction_detach(struct_processus *s_e Line 1587  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).on_exit);          liberation(s_etat_processus, (*s_etat_processus).at_exit);
         (*s_etat_processus).on_exit = NULL;          (*s_etat_processus).at_exit = NULL;
           liberation(s_etat_processus, (*s_etat_processus).at_poke);
           (*s_etat_processus).at_poke = NULL;
           (*s_etat_processus).traitement_at_poke = 'N';
   
         for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++)          for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++)
         {          {
Line 1548  instruction_detach(struct_processus *s_e Line 1616  instruction_detach(struct_processus *s_e
             (*s_etat_processus).pile_origine_interruptions[i] = NULL;              (*s_etat_processus).pile_origine_interruptions[i] = NULL;
         }          }
   
         if ((*s_etat_processus).debug == d_vrai)  
             if (((*s_etat_processus).type_debug &  
                     d_debug_processus) != 0)  
         {  
             if ((*s_etat_processus).langue == 'F')  
             {  
                 printf("[%d] Lancement du processus fils %d de %d\n",  
                         (int) getpid(), (int) getpid(), (int) ppid);  
             }  
             else  
             {  
                 printf("[%d] Start child process %d from %d\n", (int) getpid(),  
                         (int) getpid(), (int) ppid);  
             }  
   
             fflush(stdout);  
         }  
   
         /*          /*
          * On bloque l'exécution du processus fils jusqu'à ce que           * On bloque l'exécution du processus fils jusqu'à ce que
          * le père ait renseigné correctement la pile des processus.           * le père ait renseigné correctement la pile des processus.
Line 1635  instruction_detach(struct_processus *s_e Line 1685  instruction_detach(struct_processus *s_e
         }          }
   
         /*          /*
          * Initialisation de la pile des processus           * Initialisation de la pile des processus. Cette pile est effacée
            * par liberation_threads().
          */           */
   
           if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
           {
               (*s_etat_processus).erreur_systeme = d_es;
   
               pid_final = -2;
   
               while((longueur_ecriture = write_atomic(s_etat_processus,
                       (*s_argument_thread).pipe_nombre_interruptions_attente[1],
                       &pid_final, sizeof(pid_final))) != sizeof(pid_final))
               {
                   if (longueur_ecriture == -1)
                   {
                       break;
                   }
               }
   
               while((longueur_ecriture = write_atomic(s_etat_processus,
                       (*s_argument_thread).pipe_nombre_objets_attente[1],
                       &pid_final, sizeof(pid_final))) != sizeof(pid_final))
               {
                   if (longueur_ecriture == -1)
                   {
                       break;
                   }
               }
   
               BUG(1, uprintf("Process management error line %d\n", __LINE__));
               exit(EXIT_FAILURE);
           }
   
           l_element_courant = (struct_liste_chainee *)
                   (*s_etat_processus).l_base_pile_processus;
   
           while(l_element_courant != NULL)
           {
               s_argument_thread2 = (struct_descripteur_thread *)
                       (*((struct_processus_fils *) (*(*l_element_courant).donnee)
                         .objet)).thread;
   
               (*s_argument_thread2).nombre_references--;
   
               BUG((*s_argument_thread2).nombre_references < 0,
                       printf("(*s_argument_thread2).nombre_references = %d\n",
                       (int) (*s_argument_thread2).nombre_references));
   
               if ((*s_argument_thread2).nombre_references == 0)
               {
                   close((*s_argument_thread2).pipe_objets[0]);
                   close((*s_argument_thread2).pipe_acquittement[1]);
                   close((*s_argument_thread2).pipe_injections[1]);
                   close((*s_argument_thread2).pipe_nombre_injections[1]);
                   close((*s_argument_thread2).pipe_nombre_objets_attente[0]);
                   close((*s_argument_thread2).pipe_interruptions[0]);
                   close((*s_argument_thread2)
                           .pipe_nombre_interruptions_attente[0]);
   
                   pthread_mutex_destroy(&((*s_argument_thread2).mutex));
   
                   if ((*s_argument_thread2).processus_detache == d_faux)
                   {
                       if ((*s_argument_thread2).destruction_objet == d_vrai)
                       {
                           liberation(s_etat_processus,
                                   (*s_argument_thread2).argument);
                       }
                   }
   
                   free(s_argument_thread2);
                   free((*(*l_element_courant).donnee).objet);
                   free((*l_element_courant).donnee);
               }
   
               l_element_suivant = (*l_element_courant).suivant;
               free((struct_liste_chainee *) l_element_courant);
               l_element_courant = l_element_suivant;
           }
   
         (*s_etat_processus).l_base_pile_processus = NULL;          (*s_etat_processus).l_base_pile_processus = NULL;
         // Les données associées sont déjà effacées par liberation_thread().  
           if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
           {
               (*s_etat_processus).erreur_systeme = d_es;
   
               pid_final = -2;
   
               while((longueur_ecriture = write_atomic(s_etat_processus,
                       (*s_argument_thread).pipe_nombre_interruptions_attente[1],
                       &pid_final, sizeof(pid_final))) != sizeof(pid_final))
               {
                   if (longueur_ecriture == -1)
                   {
                       break;
                   }
               }
   
               while((longueur_ecriture = write_atomic(s_etat_processus,
                       (*s_argument_thread).pipe_nombre_objets_attente[1],
                       &pid_final, sizeof(pid_final))) != sizeof(pid_final))
               {
                   if (longueur_ecriture == -1)
                   {
                       break;
                   }
               }
   
               BUG(1, uprintf("Process management error line %d\n", __LINE__));
               exit(EXIT_FAILURE);
           }
   
         /*          /*
          * Initialisation de la pile système           * Initialisation de la pile système
Line 1701  instruction_detach(struct_processus *s_e Line 1858  instruction_detach(struct_processus *s_e
                 }                  }
             }              }
   
               BUG(1, uprintf("Process management error line %d\n", __LINE__));
             exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
         }          }
   
Line 1752  instruction_detach(struct_processus *s_e Line 1910  instruction_detach(struct_processus *s_e
                 }                  }
             }              }
   
               BUG(1, uprintf("Process management error line %d\n", __LINE__));
             exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
         }          }
   
Line 1824  instruction_detach(struct_processus *s_e Line 1983  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)
         {          {
             l_element_suivant = (*l_element_courant).suivant;              l_element_suivant = (*l_element_courant).suivant;
   
             sqlclose((*l_element_courant).donnee);  //          sqlclose((*l_element_courant).donnee);
             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
          * pour traiter plusieurs connexions simultanées sur les sockets           * pour traiter plusieurs connexions simultanées sur les sockets
Line 1849  instruction_detach(struct_processus *s_e Line 2017  instruction_detach(struct_processus *s_e
   
         sigpending(&set);          sigpending(&set);
   
           if ((*s_etat_processus).debug == d_vrai)
           {
               if (((*s_etat_processus).type_debug & d_debug_processus)
                       != 0)
               {
                   if ((*s_etat_processus).langue == 'F')
                   {
                       printf("[%d] Évaluation de l'objet détaché\n", getpid());
                   }
                   else
                   {
                       printf("[%d] Évaluation of detached object\n", getpid());
                   }
               }
           }
   
         if ((*s_etat_processus).erreur_systeme == d_es)          if ((*s_etat_processus).erreur_systeme == d_es)
         {          {
             if (variable_partagee == d_faux)              if (variable_partagee == d_faux)
Line 1862  instruction_detach(struct_processus *s_e Line 2046  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 1876  instruction_detach(struct_processus *s_e Line 2076  instruction_detach(struct_processus *s_e
                 }                  }
                 else                  else
                 {                  {
                     if (evaluation(s_etat_processus,                      if ((*s_etat_processus).at_exit != NULL)
                             (*s_etat_processus).on_exit, 'E') == d_erreur)  
                     {                      {
                         (*s_etat_processus).erreur_execution =                          (*s_etat_processus).var_volatile_requete_arret = 0;
                                 d_ex_erreur_evaluation;  
                           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).on_exit);  
             }              }
         }          }
   
           liberation(s_etat_processus, (*s_etat_processus).at_exit);
           liberation(s_etat_processus, (*s_etat_processus).at_poke);
   
         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 2115  instruction_detach(struct_processus *s_e Line 2322  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 2164  instruction_detach(struct_processus *s_e Line 2380  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 2194  instruction_detach(struct_processus *s_e Line 2419  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 2281  instruction_detach(struct_processus *s_e Line 2501  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 2583  instruction_detach(struct_processus *s_e Line 2809  instruction_detach(struct_processus *s_e
         liberation(s_etat_processus, s_objet);          liberation(s_etat_processus, s_objet);
   
 #       ifndef Cygwin  #       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);
 #       endif  #       endif
   
Line 2625  instruction_detach(struct_processus *s_e Line 2853  instruction_detach(struct_processus *s_e
         retrait_thread(s_etat_processus);          retrait_thread(s_etat_processus);
   
         pthread_mutex_destroy(&((*s_etat_processus).mutex));          pthread_mutex_destroy(&((*s_etat_processus).mutex));
           pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation));
         pthread_mutex_destroy(&((*s_etat_processus).protection_liste_mutexes));          pthread_mutex_destroy(&((*s_etat_processus).protection_liste_mutexes));
   
         pthread_key_delete(semaphore_fork_processus_courant);          pthread_key_delete(semaphore_fork_processus_courant);
Line 2638  instruction_detach(struct_processus *s_e Line 2867  instruction_detach(struct_processus *s_e
 #       endif  #       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  #       ifndef SEMAPHORES_NOMMES
Line 2657  instruction_detach(struct_processus *s_e Line 2885  instruction_detach(struct_processus *s_e
   
         clear_history();          clear_history();
   
           free(s_etat_processus);
   
 #       ifdef DEBUG_MEMOIRE  #       ifdef DEBUG_MEMOIRE
         debug_memoire_verification(s_etat_processus);          debug_memoire_verification();
           analyse_post_mortem();
 #       endif  #       endif
   
         exit(EXIT_SUCCESS);          exit(EXIT_SUCCESS);
Line 2667  instruction_detach(struct_processus *s_e Line 2898  instruction_detach(struct_processus *s_e
     {      {
         (*s_etat_processus).erreur_systeme = d_es_processus;          (*s_etat_processus).erreur_systeme = d_es_processus;
         return;          return;
     }  
   
     liberation(s_etat_processus, s_objet);  
   
     if ((s_objet = allocation(s_etat_processus, PRC)) == NULL)  
     {  
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;  
         return;  
     }  
   
     (*((struct_processus_fils *) (*s_objet).objet)).thread = s_argument_thread;  
     (*(*((struct_processus_fils *) (*s_objet).objet)).thread)  
             .nombre_objets_dans_pipe = 0;  
     (*(*((struct_processus_fils *) (*s_objet).objet)).thread)  
             .nombre_interruptions_dans_pipe = 0;  
     (*(*((struct_processus_fils *) (*s_objet).objet)).thread)  
             .nombre_references = 1;  
   
     /*  
      * On copie l'objet plutôt que le pointeur car cet objet peut être  
      * accédé depuis deux threads distincts et aboutir à un blocage lors d'une  
      * copie.  
      */  
   
     if ((s_objet_systeme = copie_objet(s_etat_processus, s_objet, 'O')) == NULL)  
     {  
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;  
         return;  
     }  
   
     if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)  
     {  
         (*s_etat_processus).erreur_systeme = d_es_processus;  
         return;  
     }      }
   
     // Si le pid existe déjà dans la pile des processus, il s'agit forcement      // Si le pid existe déjà dans la pile des processus, il s'agit forcement

Removed from v.1.12  
changed lines
  Added in v.1.32


CVSweb interface <joel.bertrand@systella.fr>