--- rpl/src/bibliotheques_externes.c 2017/07/02 22:28:20 1.71 +++ rpl/src/bibliotheques_externes.c 2017/07/30 21:59:41 1.74 @@ -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) @@ -373,6 +374,11 @@ 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].descripteur_bibliotheque = descripteur_bibliotheque; @@ -446,6 +452,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 +500,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 +601,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 +871,7 @@ execution_fonction_de_bibliotheque(struc struct_rpl_arguments rpl_arguments; + unsigned char *fleche; unsigned char *nom_fonction_externe; unsigned char *tampon; @@ -905,6 +916,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) /