--- rpl/src/instructions_r2.c 2011/03/06 16:44:13 1.18 +++ rpl/src/instructions_r2.c 2012/09/29 17:53:02 1.39 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.21 - Copyright (C) 1989-2011 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.10 + Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -434,8 +434,10 @@ instruction_return(struct_processus *s_e (strcmp(instruction_majuscule, "DO") == 0) || (strcmp(instruction_majuscule, "WHILE") == 0) || (strcmp(instruction_majuscule, "FOR") == 0) || + (strcmp(instruction_majuscule, "FORALL") == 0) || (strcmp(instruction_majuscule, "START") == 0) || - (strcmp(instruction_majuscule, "SELECT") == 0) + (strcmp(instruction_majuscule, "SELECT") == 0) || + (strcmp(instruction_majuscule, "CRITICAL") == 0) || (strcmp(instruction_majuscule, "CASE") == 0) || (strcmp(instruction_majuscule, "<<") == 0)) { @@ -501,9 +503,9 @@ instruction_return(struct_processus *s_e } } else if (((strcmp(instruction_majuscule, "NEXT") == 0) || - (strcmp(instruction_majuscule, "STEP") == 0)) && - ((*(*s_etat_processus).l_base_pile_systeme) - .type_cloture != 'L')) + (strcmp(instruction_majuscule, "STEP") == 0)) && + ((*(*s_etat_processus).l_base_pile_systeme) + .type_cloture != 'L')) { /* * Libération des compteurs de boucle. @@ -534,9 +536,8 @@ instruction_return(struct_processus *s_e return; } - if (((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante]).objet == NULL) + if ((*(*s_etat_processus) + .pointeur_variable_courante).objet == NULL) { (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = @@ -544,26 +545,15 @@ instruction_return(struct_processus *s_e return; } - (*(*s_etat_processus).l_base_pile_systeme) - .indice_boucle = ((*s_etat_processus) - .s_liste_variables[(*s_etat_processus) - .position_variable_courante]).objet; + (*s_etat_processus).niveau_courant--; - if (presence_compteur == d_vrai) + if (retrait_variable_par_niveau( + s_etat_processus) == d_erreur) { - (*s_etat_processus).niveau_courant--; - - if (retrait_variable_par_niveau( - s_etat_processus) == d_erreur) - { - return; - } + return; } } - (*(*s_etat_processus).l_base_pile_systeme) - .indice_boucle = NULL; - depilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es) @@ -573,6 +563,27 @@ instruction_return(struct_processus *s_e } else { + if ((*s_etat_processus).l_base_pile_systeme == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + return; + } + + if ((*(*s_etat_processus).l_base_pile_systeme) + .type_cloture == 'Q') + { + if (pthread_mutex_unlock( + &mutex_sections_critiques) != 0) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + return; + } + + (*s_etat_processus).sections_critiques--; + } + depilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es) @@ -671,8 +682,10 @@ instruction_return(struct_processus *s_e (fonction == instruction_do) || (fonction == instruction_while) || (fonction == instruction_for) || + (fonction == instruction_forall) || (fonction == instruction_start) || (fonction == instruction_select) || + (fonction == instruction_critical) || (fonction == instruction_case) || (fonction == instruction_vers_niveau_superieur)) { @@ -768,8 +781,7 @@ instruction_return(struct_processus *s_e return; } - if ((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante] + if ((*(*s_etat_processus).pointeur_variable_courante) .objet == NULL) { (*s_etat_processus).erreur_systeme = d_es; @@ -778,30 +790,40 @@ instruction_return(struct_processus *s_e return; } - (*(*s_etat_processus).l_base_pile_systeme) - .indice_boucle = ((*s_etat_processus) - .s_liste_variables[(*s_etat_processus) - .position_variable_courante]).objet; + (*s_etat_processus).niveau_courant--; - if (presence_compteur == d_vrai) + if (retrait_variable_par_niveau(s_etat_processus) + == d_erreur) { - (*s_etat_processus).niveau_courant--; - - if (retrait_variable_par_niveau(s_etat_processus) - == d_erreur) - { - return; - } + return; } } - (*(*s_etat_processus).l_base_pile_systeme) - .indice_boucle = NULL; - depilement_pile_systeme(s_etat_processus); } else { + if ((*s_etat_processus).l_base_pile_systeme == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + return; + } + + if ((*(*s_etat_processus).l_base_pile_systeme) + .type_cloture == 'Q') + { + if (pthread_mutex_unlock( + &mutex_sections_critiques) != 0) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + return; + } + + (*s_etat_processus).sections_critiques--; + } + depilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es) @@ -940,8 +962,8 @@ instruction_rdm(struct_processus *s_etat liberation(s_etat_processus, s_objet_initial); - if ((*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].variable_verrouillee == d_vrai) + if ((*(*s_etat_processus).pointeur_variable_courante) + .variable_verrouillee == d_vrai) { (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee; @@ -949,8 +971,8 @@ instruction_rdm(struct_processus *s_etat return; } - s_objet_initial = (*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante].objet; + s_objet_initial = (*(*s_etat_processus).pointeur_variable_courante) + .objet; if (s_objet_initial == NULL) { @@ -962,12 +984,10 @@ instruction_rdm(struct_processus *s_etat } if (recherche_variable_partagee(s_etat_processus, - (*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante].nom, - (*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante] - .variable_partagee, (*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante].origine) + (*(*s_etat_processus).pointeur_variable_courante).nom, + (*(*s_etat_processus).pointeur_variable_courante) + .variable_partagee, (*(*s_etat_processus) + .pointeur_variable_courante).origine) == d_faux) { if (pthread_mutex_unlock(&((*(*s_etat_processus) @@ -2212,8 +2232,7 @@ instruction_rdm(struct_processus *s_etat } else { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante].objet = + (*(*s_etat_processus).pointeur_variable_courante).objet = s_objet_redimensionne; } }