--- rpl/src/instructions_p7.c 2010/08/06 15:26:49 1.14 +++ rpl/src/instructions_p7.c 2011/08/09 11:31:34 1.33 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.18 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.3 + Copyright (C) 1989-2011 Dr. BERTRAND Joël This file is part of RPL/2. @@ -94,8 +94,8 @@ instruction_protect(struct_processus *s_ return; } - ((*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante]).variable_verrouillee = d_vrai; + (*(*s_etat_processus).pointeur_variable_courante) + .variable_verrouillee = d_vrai; } else if ((*s_objet).type == LST) { @@ -122,8 +122,8 @@ instruction_protect(struct_processus *s_ return; } - ((*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante]).variable_verrouillee = d_vrai; + (*(*s_etat_processus).pointeur_variable_courante) + .variable_verrouillee = d_vrai; l_element_courant = (*l_element_courant).suivant; } @@ -157,10 +157,6 @@ instruction_protect(struct_processus *s_ void instruction_parameter(struct_processus *s_etat_processus) { - logical1 presence_variable; - - long i; - struct_liste_chainee *l_element_courant; struct_objet *s_objet; @@ -207,7 +203,7 @@ instruction_parameter(struct_processus * if ((*s_objet).type == NOM) { - if (recherche_variable(s_etat_processus, ((*((struct_nom *) + if (recherche_variable_globale(s_etat_processus, ((*((struct_nom *) (*s_objet).objet)).nom)) == d_faux) { liberation(s_etat_processus, s_objet); @@ -217,34 +213,8 @@ instruction_parameter(struct_processus * return; } - i = (*s_etat_processus).position_variable_courante; - presence_variable = d_faux; - - while(i >= 0) - { - if ((strcmp((*s_etat_processus).s_liste_variables[i].nom, - (*((struct_nom *) (*s_objet).objet)).nom) == 0) - && ((*s_etat_processus).s_liste_variables[i].niveau == 1)) - { - presence_variable = d_vrai; - break; - } - - i--; - } - - (*s_etat_processus).position_variable_courante = i; - - if (presence_variable == d_faux) - { - liberation(s_etat_processus, s_objet); - - (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; - return; - } - - ((*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante]).variable_verrouillee = d_vrai; + (*(*s_etat_processus).pointeur_variable_courante) + .variable_verrouillee = d_vrai; } else if ((*s_objet).type == LST) { @@ -260,7 +230,7 @@ instruction_parameter(struct_processus * return; } - if (recherche_variable(s_etat_processus, (*((struct_nom *) + if (recherche_variable_globale(s_etat_processus, (*((struct_nom *) (*(*l_element_courant).donnee).objet)).nom) == d_faux) { liberation(s_etat_processus, s_objet); @@ -271,36 +241,8 @@ instruction_parameter(struct_processus * return; } - i = (*s_etat_processus).position_variable_courante; - presence_variable = d_faux; - - while(i >= 0) - { - if ((strcmp((*s_etat_processus).s_liste_variables[i].nom, - (*((struct_nom *) (*(*l_element_courant).donnee) - .objet)).nom) == 0) && ((*s_etat_processus) - .s_liste_variables[i].niveau == 1)) - { - presence_variable = d_vrai; - break; - } - - i--; - } - - (*s_etat_processus).position_variable_courante = i; - - if (presence_variable == d_faux) - { - liberation(s_etat_processus, s_objet); - - (*s_etat_processus).erreur_execution = - d_ex_variable_non_definie; - return; - } - - ((*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante]).variable_verrouillee = d_vrai; + (*(*s_etat_processus).pointeur_variable_courante) + .variable_verrouillee = d_vrai; l_element_courant = (*l_element_courant).suivant; } @@ -1350,10 +1292,9 @@ instruction_private(struct_processus *s_ } if (recherche_variable_partagee(s_etat_processus, ((*((struct_nom *) - (*s_objet).objet)).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_objet).objet)).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) @@ -1369,8 +1310,7 @@ instruction_private(struct_processus *s_ return; } - (*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].objet = + (*(*s_etat_processus).pointeur_variable_courante).objet = (*(*s_etat_processus).s_liste_variables_partagees).table [(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet; @@ -1380,8 +1320,8 @@ instruction_private(struct_processus *s_ if (retrait_variable_partagee(s_etat_processus, (*((struct_nom *) (*s_objet).objet)).nom, - (*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].variable_partagee) == d_erreur) + (*(*s_etat_processus).pointeur_variable_courante) + .variable_partagee) == d_erreur) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) @@ -1394,17 +1334,15 @@ instruction_private(struct_processus *s_ return; } - if ((*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].origine == 'P') + if ((*(*s_etat_processus).pointeur_variable_courante).origine == 'P') { - (*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].variable_partagee.adresse = 0; + (*(*s_etat_processus).pointeur_variable_courante) + .variable_partagee.adresse = 0; } else { - (*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].variable_partagee.pointeur - = NULL; + (*(*s_etat_processus).pointeur_variable_courante) + .variable_partagee.pointeur = NULL; } if (pthread_mutex_unlock(&((*(*s_etat_processus) @@ -1447,11 +1385,9 @@ instruction_private(struct_processus *s_ } if (recherche_variable_partagee(s_etat_processus, ((*((struct_nom *) - (*s_objet).objet)).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_objet).objet)).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) @@ -1469,8 +1405,7 @@ instruction_private(struct_processus *s_ return; } - (*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].objet = + (*(*s_etat_processus).pointeur_variable_courante).objet = (*(*s_etat_processus).s_liste_variables_partagees).table [(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet; @@ -1478,24 +1413,22 @@ instruction_private(struct_processus *s_ [(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet = NULL; - if ((*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].origine == 'P') + if ((*(*s_etat_processus).pointeur_variable_courante).origine + == 'P') { - (*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].variable_partagee.adresse - = 0; + (*(*s_etat_processus).pointeur_variable_courante) + .variable_partagee.adresse = 0; } else { - (*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].variable_partagee.pointeur - = NULL; + (*(*s_etat_processus).pointeur_variable_courante) + .variable_partagee.pointeur = NULL; } if (retrait_variable_partagee(s_etat_processus, (*((struct_nom *) (*s_objet).objet)).nom, - (*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].variable_statique) == d_erreur) + (*(*s_etat_processus).pointeur_variable_courante) + .variable_statique) == d_erreur) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) @@ -1809,6 +1742,13 @@ instruction_procid(struct_processus *s_e (*s_objet).objet)).thread).mutex), &attributs_mutex); pthread_mutexattr_destroy(&attributs_mutex); + pthread_mutexattr_init(&attributs_mutex); + pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&((*(*((struct_processus_fils *) + (*s_objet).objet)).thread).mutex_nombre_references), + &attributs_mutex); + pthread_mutexattr_destroy(&attributs_mutex); + if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet) == d_erreur) {