Diff for /rpl/src/bibliotheques_externes.c between versions 1.51 and 1.77

version 1.51, 2013/03/20 17:11:43 version 1.77, 2018/05/30 09:27:30
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.1.13    RPL/2 (R) version 4.1.29
   Copyright (C) 1989-2013 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 41  void * Line 41  void *
 chargement_bibliotheque(struct_processus *s_etat_processus,  chargement_bibliotheque(struct_processus *s_etat_processus,
         unsigned char *bibliotheque)          unsigned char *bibliotheque)
 {  {
     char                    **(*fonction)(integer8   *, const char *);      char                    **(*fonction)(struct_rpl_arguments *,
                                       integer8 *, const char *);
     char                    *message;      char                    *message;
   
     integer8                i;      integer8                i;
Line 52  chargement_bibliotheque(struct_processus Line 53  chargement_bibliotheque(struct_processus
     struct_liste_chainee    *l_element_courant;      struct_liste_chainee    *l_element_courant;
     struct_liste_chainee    *l_nouvel_element;      struct_liste_chainee    *l_nouvel_element;
   
       unsigned char           *fleche;
     unsigned char           **tableau;      unsigned char           **tableau;
     unsigned char           *tampon;      unsigned char           *tampon;
   
     void                    *descripteur_bibliotheque;      void                    *descripteur_bibliotheque;
     void                    (*onloading)(struct_rpl_arguments *);      int                     (*onloading)(struct_rpl_arguments *, void *);
   
     /*      /*
      * On vérifie que la bibliothèque n'est pas déjà chargée.       * On vérifie que la bibliothèque n'est pas déjà chargée.
Line 171  chargement_bibliotheque(struct_processus Line 173  chargement_bibliotheque(struct_processus
             return(NULL);              return(NULL);
         }          }
   
         (*onloading)(&rpl_arguments);          (*onloading)(&rpl_arguments, descripteur_bibliotheque);
   
 #       ifndef SEMAPHORES_NOMMES  #       ifndef SEMAPHORES_NOMMES
             while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)              while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
Line 304  chargement_bibliotheque(struct_processus Line 306  chargement_bibliotheque(struct_processus
     }      }
   
     dlerror();      dlerror();
     fonction = dlsym(descripteur_bibliotheque, "__external_symbols");      fonction = dlsym(descripteur_bibliotheque, "___external_symbols");
   
     if (fonction == NULL)      if (fonction == NULL)
     {      {
Line 335  chargement_bibliotheque(struct_processus Line 337  chargement_bibliotheque(struct_processus
      * Ajout des symboles externes       * Ajout des symboles externes
      */       */
   
     if ((tableau = (unsigned char **) (*fonction)((&nombre_symboles),      if ((tableau = (unsigned char **) (*fonction)(&rpl_arguments,
             d_version_rpl)) == NULL)              (&nombre_symboles), d_version_rpl)) == NULL)
     {      {
         /*          /*
          * Nombre symboles :           * Nombre symboles :
Line 372  chargement_bibliotheque(struct_processus Line 374  chargement_bibliotheque(struct_processus
   
     for(i = 0; i < nombre_symboles; i++)      for(i = 0; i < nombre_symboles; i++)
     {      {
           if ((fleche = strstr(tableau[i], "->")) != NULL)
           {
               strncpy(fleche, "to", 2);
               (*s_etat_processus).s_instructions_externes[(*s_etat_processus)
                       .nombre_instructions_externes].position_fleche =
                       fleche - tableau[i];
           }
           else
           {
               (*s_etat_processus).s_instructions_externes[(*s_etat_processus)
                       .nombre_instructions_externes].position_fleche = -1;
           }
   
         (*s_etat_processus).s_instructions_externes[(*s_etat_processus)          (*s_etat_processus).s_instructions_externes[(*s_etat_processus)
                 .nombre_instructions_externes].descripteur_bibliotheque =                  .nombre_instructions_externes].descripteur_bibliotheque =
                 descripteur_bibliotheque;                  descripteur_bibliotheque;
Line 445  chargement_bibliotheque(struct_processus Line 460  chargement_bibliotheque(struct_processus
             [(*s_etat_processus).nombre_instructions_externes - 1]              [(*s_etat_processus).nombre_instructions_externes - 1]
             .nom_bibliotheque);              .nom_bibliotheque);
   
       // La nouvelle bibliothèque est mise en tête de la liste pour que
       // les bibliothèques soient implicitement déchargées dans l'ordre
       // inverse de leur chargement.
   
     (*l_nouvel_element).suivant = (*s_etat_processus).s_bibliotheques;      (*l_nouvel_element).suivant = (*s_etat_processus).s_bibliotheques;
     (*s_etat_processus).s_bibliotheques = l_nouvel_element;      (*s_etat_processus).s_bibliotheques = l_nouvel_element;
   
Line 489  retrait_bibliotheque(struct_processus *s Line 508  retrait_bibliotheque(struct_processus *s
     integer8                    j;      integer8                    j;
     integer8                    nombre_symboles_residuels;      integer8                    nombre_symboles_residuels;
   
     void                        (*onclosing)(struct_rpl_arguments *);      int                         (*onclosing)(struct_rpl_arguments *, void *);
   
     l_element_courant = (*s_etat_processus).s_bibliotheques;      l_element_courant = (*s_etat_processus).s_bibliotheques;
     presence_bibliotheque = d_faux;      presence_bibliotheque = d_faux;
Line 590  retrait_bibliotheque(struct_processus *s Line 609  retrait_bibliotheque(struct_processus *s
                 return(d_erreur);                  return(d_erreur);
             }              }
   
             (*onclosing)(&rpl_arguments);              (*onclosing)(&rpl_arguments, (*descripteur).descripteur);
   
 #           ifndef SEMAPHORES_NOMMES  #           ifndef SEMAPHORES_NOMMES
                 while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)                  while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
Line 860  execution_fonction_de_bibliotheque(struc Line 879  execution_fonction_de_bibliotheque(struc
   
     struct_rpl_arguments            rpl_arguments;      struct_rpl_arguments            rpl_arguments;
   
       unsigned char                   *fleche;
     unsigned char                   *nom_fonction_externe;      unsigned char                   *nom_fonction_externe;
     unsigned char                   *tampon;      unsigned char                   *tampon;
   
Line 870  execution_fonction_de_bibliotheque(struc Line 890  execution_fonction_de_bibliotheque(struc
     integer8                        nombre_iterations_maximal;      integer8                        nombre_iterations_maximal;
     integer8                        ordre_iteration;      integer8                        ordre_iteration;
   
     void                            (*fonction)(struct_rpl_arguments *);      int                             (*fonction)(struct_rpl_arguments *);
   
     /*      /*
      * Recherche dichotomique de la définition externe       * Recherche dichotomique de la définition externe
Line 904  execution_fonction_de_bibliotheque(struc Line 924  execution_fonction_de_bibliotheque(struc
         }          }
     }      }
   
       if ((fleche = strstr(nom_fonction, "->")) != NULL)
       {
           strncpy(fleche, "to", 2);
       }
   
     ordre_iteration = 0;      ordre_iteration = 0;
     nombre_iterations_maximal = ((integer8)      nombre_iterations_maximal = ((integer8)
             (log((real8) (*s_etat_processus).nombre_instructions_externes) /              (log((real8) (*s_etat_processus).nombre_instructions_externes) /
Line 1405  empilement_pile_operationnelle(struct_rp Line 1430  empilement_pile_operationnelle(struct_rp
     struct_liste_chainee        *l_ancienne_base_liste;      struct_liste_chainee        *l_ancienne_base_liste;
     struct_liste_chainee        *l_nouvelle_base_liste;      struct_liste_chainee        *l_nouvelle_base_liste;
   
       struct_processus            *s_etat_processus;
   
     l_ancienne_base_liste = (*s_rpl_arguments).l_base_pile;      l_ancienne_base_liste = (*s_rpl_arguments).l_base_pile;
       s_etat_processus = (*s_rpl_arguments).s_etat_processus;
   
     l_nouvelle_base_liste = (struct_liste_chainee *) malloc(      l_nouvelle_base_liste = (struct_liste_chainee *) malloc(
             sizeof(struct_liste_chainee));              sizeof(struct_liste_chainee));
Line 1441  depilement_pile_operationnelle(struct_rp Line 1469  depilement_pile_operationnelle(struct_rp
     struct_liste_chainee        *l_ancienne_base_liste;      struct_liste_chainee        *l_ancienne_base_liste;
     struct_liste_chainee        *l_nouvelle_base_liste;      struct_liste_chainee        *l_nouvelle_base_liste;
   
       struct_processus            *s_etat_processus;
   
     if ((*s_rpl_arguments).l_base_pile == NULL)      if ((*s_rpl_arguments).l_base_pile == NULL)
     {      {
         *s_objet = NULL;          *s_objet = NULL;
Line 1450  depilement_pile_operationnelle(struct_rp Line 1480  depilement_pile_operationnelle(struct_rp
     {      {
         l_ancienne_base_liste = (*s_rpl_arguments).l_base_pile;          l_ancienne_base_liste = (*s_rpl_arguments).l_base_pile;
         l_nouvelle_base_liste = (*l_ancienne_base_liste).suivant;          l_nouvelle_base_liste = (*l_ancienne_base_liste).suivant;
           s_etat_processus = (*s_rpl_arguments).s_etat_processus;
   
         *s_objet = (*l_ancienne_base_liste).donnee;          *s_objet = (*l_ancienne_base_liste).donnee;
         free(l_ancienne_base_liste);          free(l_ancienne_base_liste);

Removed from v.1.51  
changed lines
  Added in v.1.77


CVSweb interface <joel.bertrand@systella.fr>