--- rpl/src/optimisation.c 2011/06/27 09:05:01 1.30 +++ rpl/src/optimisation.c 2013/03/23 16:14:39 1.50 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.0 - Copyright (C) 1989-2011 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.13 + Copyright (C) 1989-2013 Dr. BERTRAND Joël This file is part of RPL/2. @@ -38,9 +38,11 @@ logical1 sequenceur_optimise(struct_processus *s_etat_processus) { - int i; - int nb_variables; - int point_entree; + integer8 adresse_point_entree; + integer8 i; + integer8 j; + integer8 nb_variables; + integer8 point_entree; logical1 erreur; @@ -51,8 +53,6 @@ sequenceur_optimise(struct_processus *s_ unsigned char *message; unsigned char registre; - unsigned long adresse_point_entree; - if ((*s_etat_processus).debug == d_vrai) if (((*s_etat_processus).type_debug & d_debug_analyse) != 0) @@ -72,17 +72,23 @@ sequenceur_optimise(struct_processus *s_ point_entree = -1; adresse_point_entree = 0; + programme_principal = NULL; empilement_pile_systeme(s_etat_processus); (*(*s_etat_processus).l_base_pile_systeme).retour_definition = 'Y'; (*s_etat_processus).autorisation_empilement_programme = 'Y'; (*s_etat_processus).mode_execution_programme = 'N'; - nb_variables = nombre_variables(s_etat_processus, - (*s_etat_processus).s_arbre_variables); + if (pthread_mutex_lock(&mutex_liste_variables_partagees) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return(d_erreur); + } - if ((tableau = malloc(nb_variables * sizeof(struct_tableau_variables))) - == NULL) + nb_variables = nombre_variables(s_etat_processus); + + if ((tableau = malloc(((size_t) nb_variables) * + sizeof(struct_tableau_variables))) == NULL) { if ((*s_etat_processus).langue == 'F') { @@ -93,11 +99,19 @@ sequenceur_optimise(struct_processus *s_ printf("+++System : Not enough memory\n"); } + liberation_mutexes_arbre_variables_partagees(s_etat_processus, + (*(*s_etat_processus).s_arbre_variables_partagees)); + pthread_mutex_unlock(&mutex_liste_variables_partagees); return(d_erreur); } - liste_variables(s_etat_processus, tableau, 0, - (*s_etat_processus).s_arbre_variables); + nb_variables = liste_variables(s_etat_processus, tableau); + + if (pthread_mutex_unlock(&mutex_liste_variables_partagees) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return(d_erreur); + } for(i = 0; i < nb_variables; i++) { @@ -105,7 +119,7 @@ sequenceur_optimise(struct_processus *s_ { // Variables qui contiennent les points d'entrée des définitions. - (*s_etat_processus).position_courante = (*((unsigned long *) + (*s_etat_processus).position_courante = (*((integer8 *) (*(tableau[i].objet)).objet)); if (point_entree == -1) @@ -136,6 +150,14 @@ sequenceur_optimise(struct_processus *s_ printf("+++Fatal : Compilation failed\n"); } + for(j = 0; j < nb_variables; j++) + { + if (tableau[j].mutex != NULL) + { + pthread_mutex_unlock(tableau[j].mutex); + } + } + free(tableau); return(d_erreur); } @@ -194,6 +216,14 @@ sequenceur_optimise(struct_processus *s_ printf("+++Fatal : Compilation failed\n"); } + for(j = 0; j < nb_variables; j++) + { + if (tableau[j].mutex != NULL) + { + pthread_mutex_unlock(tableau[j].mutex); + } + } + free(tableau); return(d_erreur); } @@ -213,6 +243,14 @@ sequenceur_optimise(struct_processus *s_ printf("+++Fatal : Compilation failed\n"); } + for(j = 0; j < nb_variables; j++) + { + if (tableau[j].mutex != NULL) + { + pthread_mutex_unlock(tableau[j].mutex); + } + } + free(tableau); return(d_erreur); } @@ -232,6 +270,14 @@ sequenceur_optimise(struct_processus *s_ printf("+++Fatal : Compilation failed\n"); } + for(j = 0; j < nb_variables; j++) + { + if (tableau[j].mutex != NULL) + { + pthread_mutex_unlock(tableau[j].mutex); + } + } + free(tableau); return(d_erreur); } @@ -258,6 +304,14 @@ sequenceur_optimise(struct_processus *s_ printf("+++Fatal : Compilation failed\n"); } + for(j = 0; j < nb_variables; j++) + { + if (tableau[j].mutex != NULL) + { + pthread_mutex_unlock(tableau[j].mutex); + } + } + free(tableau); return(d_erreur); } @@ -299,6 +353,14 @@ sequenceur_optimise(struct_processus *s_ printf("+++Fatal : Compilation failed\n"); } + for(j = 0; j < nb_variables; j++) + { + if (tableau[j].mutex != NULL) + { + pthread_mutex_unlock(tableau[j].mutex); + } + } + free(tableau); return(d_erreur); } @@ -323,10 +385,26 @@ sequenceur_optimise(struct_processus *s_ printf("+++System : Not enough memory\n"); } + for(j = 0; j < nb_variables; j++) + { + if (tableau[j].mutex != NULL) + { + pthread_mutex_unlock(tableau[j].mutex); + } + } + free(tableau); return(d_erreur); } + for(j = 0; j < nb_variables; j++) + { + if (tableau[j].mutex != NULL) + { + pthread_mutex_unlock(tableau[j].mutex); + } + } + free(tableau); erreur = evaluation(s_etat_processus, programme_principal, 'E');