--- rpl/src/instructions_r2.c 2012/08/22 10:47:17 1.38 +++ rpl/src/instructions_r2.c 2012/09/29 17:53:02 1.39 @@ -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. @@ -543,25 +545,15 @@ instruction_return(struct_processus *s_e return; } - (*(*s_etat_processus).l_base_pile_systeme) - .indice_boucle = (*(*s_etat_processus) - .pointeur_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) @@ -571,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) @@ -669,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)) { @@ -775,29 +790,40 @@ instruction_return(struct_processus *s_e return; } - (*(*s_etat_processus).l_base_pile_systeme) - .indice_boucle = (*(*s_etat_processus) - .pointeur_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)