--- rpl/src/instructions_r2.c 2012/04/13 14:12:58 1.36 +++ rpl/src/instructions_r2.c 2012/12/13 16:59:42 1.43 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.8 + RPL/2 (R) version 4.1.11 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)) { @@ -444,6 +446,7 @@ instruction_return(struct_processus *s_e analyse(s_etat_processus, NULL); } else if ((strcmp(instruction_majuscule, "FOR") == 0) || + (strcmp(instruction_majuscule, "FORALL") == 0) || (strcmp(instruction_majuscule, "START") == 0)) { empilement_pile_systeme(s_etat_processus); @@ -501,17 +504,18 @@ 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. */ - presence_compteur = ((*(*s_etat_processus) - .l_base_pile_systeme).type_cloture == 'F') - ? d_vrai : d_faux; + presence_compteur = (((*(*s_etat_processus) + .l_base_pile_systeme).type_cloture == 'F') || + ((*(*s_etat_processus).l_base_pile_systeme) + .type_cloture == 'A')) ? d_vrai : d_faux; if (((*(*s_etat_processus).l_base_pile_systeme) .type_cloture != 'S') && @@ -543,25 +547,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_variables_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 +565,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 +684,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)) { @@ -680,6 +697,7 @@ instruction_return(struct_processus *s_e instruction_vers_niveau_superieur); } else if ((fonction == instruction_for) || + (fonction == instruction_forall) || (fonction == instruction_start)) { empilement_pile_systeme(s_etat_processus); @@ -741,9 +759,10 @@ instruction_return(struct_processus *s_e * Libération des compteurs de boucle. */ - presence_compteur = ((*(*s_etat_processus) - .l_base_pile_systeme).type_cloture == 'F') - ? d_vrai : d_faux; + presence_compteur = (((*(*s_etat_processus) + .l_base_pile_systeme).type_cloture == 'F') || + ((*(*s_etat_processus).l_base_pile_systeme) + .type_cloture == 'A')) ? d_vrai : d_faux; if (((*(*s_etat_processus).l_base_pile_systeme) .type_cloture != 'S') && @@ -775,29 +794,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_variables_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) @@ -950,13 +980,6 @@ instruction_rdm(struct_processus *s_etat if (s_objet_initial == NULL) { - if (pthread_mutex_lock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - if (recherche_variable_partagee(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).nom, (*(*s_etat_processus).pointeur_variable_courante) @@ -964,13 +987,6 @@ instruction_rdm(struct_processus *s_etat .pointeur_variable_courante).origine) == d_faux) { - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; @@ -993,7 +1009,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1025,7 +1041,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1055,7 +1071,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1078,7 +1094,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1115,7 +1131,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1144,7 +1160,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1165,7 +1181,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1202,7 +1218,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1223,7 +1239,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1261,7 +1277,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1283,7 +1299,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1330,7 +1346,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1351,7 +1367,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1401,7 +1417,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1422,7 +1438,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1473,7 +1489,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1495,7 +1511,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1550,7 +1566,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1588,7 +1604,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1612,7 +1628,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1632,7 +1648,8 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) + != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1673,7 +1690,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1697,7 +1714,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1717,7 +1734,8 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) + != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1758,7 +1776,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1782,7 +1800,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1803,7 +1821,8 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) + != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1855,7 +1874,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1879,7 +1898,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1902,7 +1921,8 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) + != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1954,7 +1974,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1978,7 +1998,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -2001,7 +2021,8 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) + != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -2053,7 +2074,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -2077,7 +2098,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -2100,7 +2121,8 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) + != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -2158,7 +2180,7 @@ instruction_rdm(struct_processus *s_etat if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -2193,12 +2215,11 @@ instruction_rdm(struct_processus *s_etat { if (variable_partagee == d_vrai) { - (*(*s_etat_processus).s_liste_variables_partagees).table - [(*(*s_etat_processus).s_liste_variables_partagees) - .position_variable].objet = s_objet_redimensionne; + (*(*s_etat_processus).pointeur_variable_partagee_courante).objet = + s_objet_redimensionne; if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return;