Diff for /rpl/src/bibliotheques_externes.c between versions 1.6 and 1.35

version 1.6, 2010/04/07 13:45:00 version 1.35, 2011/09/20 08:56:23
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.0.14    RPL/2 (R) version 4.1.3
   Copyright (C) 1989-2010 Dr. BERTRAND Joël    Copyright (C) 1989-2011 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 20 Line 20
 */  */
   
   
 #include "rpl.conv.h"  #include "rpl-conv.h"
   
 static pthread_mutex_t          mutex = PTHREAD_MUTEX_INITIALIZER;  static pthread_mutex_t          mutex = PTHREAD_MUTEX_INITIALIZER;
   
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)(unsigned long *);      char                    **(*fonction)(unsigned long *, const char *);
     char                    *message;      char                    *message;
   
       long                    i;
       long                    nombre_symboles;
   
     struct_rpl_arguments    rpl_arguments;      struct_rpl_arguments    rpl_arguments;
   
     struct_liste_chainee    *l_element_courant;      struct_liste_chainee    *l_element_courant;
Line 52  chargement_bibliotheque(struct_processus Line 55  chargement_bibliotheque(struct_processus
     unsigned char           **tableau;      unsigned char           **tableau;
     unsigned char           *tampon;      unsigned char           *tampon;
   
     unsigned long           nombre_symboles;  
     unsigned long           i;  
   
     void                    *descripteur_bibliotheque;      void                    *descripteur_bibliotheque;
     void                    (*onloading)(struct_rpl_arguments *);      void                    (*onloading)(struct_rpl_arguments *);
   
Line 169  chargement_bibliotheque(struct_processus Line 169  chargement_bibliotheque(struct_processus
   
         (*onloading)(&rpl_arguments);          (*onloading)(&rpl_arguments);
   
         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)          if (sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
         {          {
             if (errno != EINTR)              (*s_etat_processus).erreur_systeme = d_es_processus;
             {              return(NULL);
                 (*s_etat_processus).erreur_systeme = d_es_processus;  
                 return(NULL);  
             }  
         }          }
   
         if ((*s_etat_processus).profilage == d_vrai)          if ((*s_etat_processus).profilage == d_vrai)
Line 315  chargement_bibliotheque(struct_processus Line 312  chargement_bibliotheque(struct_processus
         }          }
     }      }
     
       dlerror();
   
     if (pthread_mutex_unlock(&mutex) != 0)      if (pthread_mutex_unlock(&mutex) != 0)
     {      {
         (*s_etat_processus).erreur_systeme = d_es_processus;          (*s_etat_processus).erreur_systeme = d_es_processus;
Line 325  chargement_bibliotheque(struct_processus Line 324  chargement_bibliotheque(struct_processus
      * Ajout des symboles externes       * Ajout des symboles externes
      */       */
   
     if ((tableau = (unsigned char **) (*fonction)(&nombre_symboles)) == NULL)      if ((tableau = (unsigned char **) (*fonction)((&nombre_symboles),
               d_version_rpl)) == NULL)
     {      {
           /*
            * Nombre symboles :
            * 0    : aucun symbole exporté
            * >0   : nombre de symboles exportés
            * -1   : version de bibliothèque incompatible
            */
   
         if (nombre_symboles == 0)          if (nombre_symboles == 0)
         {          {
             (*s_etat_processus).erreur_execution = d_ex_aucun_symbole;              (*s_etat_processus).erreur_execution = d_ex_aucun_symbole;
         }          }
           else if (nombre_symboles == -1)
           {
               (*s_etat_processus).erreur_execution = d_ex_version_bibliotheque;
           }
         else          else
         {          {
             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;              (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
Line 380  chargement_bibliotheque(struct_processus Line 391  chargement_bibliotheque(struct_processus
         strcpy((*s_etat_processus).s_instructions_externes[(*s_etat_processus)          strcpy((*s_etat_processus).s_instructions_externes[(*s_etat_processus)
                 .nombre_instructions_externes].nom_bibliotheque, tableau[i]);                  .nombre_instructions_externes].nom_bibliotheque, tableau[i]);
         (*s_etat_processus).nombre_instructions_externes++;          (*s_etat_processus).nombre_instructions_externes++;
   
         free(tableau[i]);          free(tableau[i]);
     }      }
   
Line 565  retrait_bibliotheque(struct_processus *s Line 577  retrait_bibliotheque(struct_processus *s
   
             (*onclosing)(&rpl_arguments);              (*onclosing)(&rpl_arguments);
   
             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)              if (sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
             {              {
                 if (errno != EINTR)                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 {                  return(d_erreur);
                     (*s_etat_processus).erreur_systeme = d_es_processus;  
                     return(d_erreur);  
                 }  
             }              }
   
             if ((*s_etat_processus).profilage == d_vrai)              if ((*s_etat_processus).profilage == d_vrai)
Line 1067  execution_fonction_de_bibliotheque(struc Line 1076  execution_fonction_de_bibliotheque(struc
         }          }
     }      }
   
       dlerror();
   
     if (pthread_mutex_unlock(&mutex) != 0)      if (pthread_mutex_unlock(&mutex) != 0)
     {      {
         (*s_etat_processus).erreur_systeme = d_es_processus;          (*s_etat_processus).erreur_systeme = d_es_processus;
Line 1130  execution_fonction_de_bibliotheque(struc Line 1141  execution_fonction_de_bibliotheque(struc
   
     (*fonction)(&rpl_arguments);      (*fonction)(&rpl_arguments);
   
     while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)      if (sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
     {      {
         if (errno != EINTR)          (*s_etat_processus).erreur_systeme = d_es_processus;
         {          return(d_faux);
             (*s_etat_processus).erreur_systeme = d_es_processus;  
             return(d_faux);  
         }  
     }      }
   
     if ((*s_etat_processus).profilage == d_vrai)      if ((*s_etat_processus).profilage == d_vrai)
Line 1593  tri_base_symboles_externes(struct_proces Line 1601  tri_base_symboles_externes(struct_proces
             do              do
             {              {
                 indice_i = indice_j;                  indice_i = indice_j;
   
                 terminaison_boucle_3 = d_faux;                  terminaison_boucle_3 = d_faux;
   
                 do                  do
Line 1687  tri_base_symboles_externes(struct_proces Line 1694  tri_base_symboles_externes(struct_proces
   
         indice_i++;          indice_i++;
     } while((unsigned long) (indice_i + 1) <      } while((unsigned long) (indice_i + 1) <
             (*s_etat_processus).nombre_variables);              (*s_etat_processus).nombre_instructions_externes);
   
     return;      return;
 }  }

Removed from v.1.6  
changed lines
  Added in v.1.35


CVSweb interface <joel.bertrand@systella.fr>