--- rpl/src/bibliotheques_externes.c 2013/06/21 14:15:51 1.54 +++ rpl/src/bibliotheques_externes.c 2017/07/31 12:03:30 1.75 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.15 - Copyright (C) 1989-2013 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.27 + Copyright (C) 1989-2017 Dr. BERTRAND Joël This file is part of RPL/2. @@ -53,11 +53,12 @@ chargement_bibliotheque(struct_processus struct_liste_chainee *l_element_courant; struct_liste_chainee *l_nouvel_element; + unsigned char *fleche; unsigned char **tableau; unsigned char *tampon; void *descripteur_bibliotheque; - int (*onloading)(struct_rpl_arguments *); + int (*onloading)(struct_rpl_arguments *, void *); /* * On vérifie que la bibliothèque n'est pas déjà chargée. @@ -172,7 +173,7 @@ chargement_bibliotheque(struct_processus return(NULL); } - (*onloading)(&rpl_arguments); + (*onloading)(&rpl_arguments, descripteur_bibliotheque); # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) @@ -305,7 +306,7 @@ chargement_bibliotheque(struct_processus } dlerror(); - fonction = dlsym(descripteur_bibliotheque, "__external_symbols"); + fonction = dlsym(descripteur_bibliotheque, "___external_symbols"); if (fonction == NULL) { @@ -373,6 +374,19 @@ chargement_bibliotheque(struct_processus 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) .nombre_instructions_externes].descripteur_bibliotheque = descripteur_bibliotheque; @@ -446,6 +460,10 @@ chargement_bibliotheque(struct_processus [(*s_etat_processus).nombre_instructions_externes - 1] .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; (*s_etat_processus).s_bibliotheques = l_nouvel_element; @@ -490,7 +508,7 @@ retrait_bibliotheque(struct_processus *s integer8 j; integer8 nombre_symboles_residuels; - int (*onclosing)(struct_rpl_arguments *); + int (*onclosing)(struct_rpl_arguments *, void *); l_element_courant = (*s_etat_processus).s_bibliotheques; presence_bibliotheque = d_faux; @@ -591,7 +609,7 @@ retrait_bibliotheque(struct_processus *s return(d_erreur); } - (*onclosing)(&rpl_arguments); + (*onclosing)(&rpl_arguments, (*descripteur).descripteur); # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) @@ -861,6 +879,7 @@ execution_fonction_de_bibliotheque(struc struct_rpl_arguments rpl_arguments; + unsigned char *fleche; unsigned char *nom_fonction_externe; unsigned char *tampon; @@ -905,6 +924,11 @@ execution_fonction_de_bibliotheque(struc } } + if ((fleche = strstr(nom_fonction, "->")) != NULL) + { + strncpy(fleche, "to", 2); + } + ordre_iteration = 0; nombre_iterations_maximal = ((integer8) (log((real8) (*s_etat_processus).nombre_instructions_externes) / @@ -1406,7 +1430,10 @@ empilement_pile_operationnelle(struct_rp struct_liste_chainee *l_ancienne_base_liste; struct_liste_chainee *l_nouvelle_base_liste; + struct_processus *s_etat_processus; + 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( sizeof(struct_liste_chainee)); @@ -1442,6 +1469,8 @@ depilement_pile_operationnelle(struct_rp struct_liste_chainee *l_ancienne_base_liste; struct_liste_chainee *l_nouvelle_base_liste; + struct_processus *s_etat_processus; + if ((*s_rpl_arguments).l_base_pile == NULL) { *s_objet = NULL; @@ -1451,6 +1480,7 @@ depilement_pile_operationnelle(struct_rp { l_ancienne_base_liste = (*s_rpl_arguments).l_base_pile; 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; free(l_ancienne_base_liste);