--- rpl/src/instructions_c2.c 2012/09/30 20:46:46 1.39 +++ rpl/src/instructions_c2.c 2013/03/16 11:31:41 1.48 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.10 - Copyright (C) 1989-2012 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. @@ -437,6 +437,7 @@ instruction_con(struct_processus *s_etat struct_objet *s_objet_resultat; logical1 argument_nom; + logical1 variable_partagee; unsigned long i; unsigned long j; @@ -554,58 +555,40 @@ instruction_con(struct_processus *s_etat { // Variable partagée - if (pthread_mutex_lock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } + variable_partagee = d_vrai; if (recherche_variable_partagee(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).nom, (*(*s_etat_processus).pointeur_variable_courante) .variable_partagee, (*(*s_etat_processus) .pointeur_variable_courante).origine) - == d_faux) + == NULL) { (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); return; } - s_objet_2 = (*(*s_etat_processus).s_liste_variables_partagees) - .table[(*(*s_etat_processus).s_liste_variables_partagees) - .position_variable].objet; - - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } + s_objet_2 = (*(*s_etat_processus) + .pointeur_variable_partagee_courante).objet; } else { // Variable privée s_objet_2 = (*(*s_etat_processus).pointeur_variable_courante).objet; + variable_partagee = d_faux; } } else { argument_nom = d_faux; + variable_partagee = d_faux; } /* @@ -633,6 +616,18 @@ instruction_con(struct_processus *s_etat { liberation(s_etat_processus, s_objet_2); } + else + { + if (variable_partagee == d_vrai) + { + if (pthread_mutex_unlock(&((*(*s_etat_processus) + .pointeur_variable_partagee_courante).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } + } (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides; return; @@ -653,6 +648,19 @@ instruction_con(struct_processus *s_etat { liberation(s_etat_processus, s_objet_2); } + else + { + if (variable_partagee == d_vrai) + { + if (pthread_mutex_unlock(&((*(*s_etat_processus) + .pointeur_variable_partagee_courante).mutex)) + != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } + } (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; @@ -667,6 +675,19 @@ instruction_con(struct_processus *s_etat { liberation(s_etat_processus, s_objet_2); } + else + { + if (variable_partagee == d_vrai) + { + if (pthread_mutex_unlock(&((*(*s_etat_processus) + .pointeur_variable_partagee_courante).mutex)) + != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } + } (*s_etat_processus).erreur_execution = d_ex_argument_invalide; return; @@ -724,6 +745,18 @@ instruction_con(struct_processus *s_etat { liberation(s_etat_processus, s_objet_2); } + else + { + if (variable_partagee == d_vrai) + { + if (pthread_mutex_unlock(&((*(*s_etat_processus) + .pointeur_variable_partagee_courante).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } + } liberation(s_etat_processus, s_objet_1); @@ -745,6 +778,18 @@ instruction_con(struct_processus *s_etat { liberation(s_etat_processus, s_objet_2); } + else + { + if (variable_partagee == d_vrai) + { + if (pthread_mutex_unlock(&((*(*s_etat_processus) + .pointeur_variable_partagee_courante).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } + } liberation(s_etat_processus, s_objet_1); @@ -990,8 +1035,23 @@ instruction_con(struct_processus *s_etat } else { - (*(*s_etat_processus).pointeur_variable_courante).objet = - s_objet_resultat; + if (variable_partagee == d_vrai) + { + (*(*s_etat_processus).pointeur_variable_partagee_courante).objet = + s_objet_resultat; + + if (pthread_mutex_unlock(&((*(*s_etat_processus) + .pointeur_variable_partagee_courante).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } + else + { + (*(*s_etat_processus).pointeur_variable_courante).objet = + s_objet_resultat; + } } return; @@ -1130,9 +1190,7 @@ instruction_cross(struct_processus *s_et .tableau)[2]), &(((integer8 *) (*((struct_vecteur *) (*s_objet_argument_1).objet)).tableau)[1]), &(tampon_2)); - tampon_2 = -tampon_2; - - depassement |= depassement_addition(&(tampon_1), &(tampon_2), + depassement |= depassement_soustraction(&(tampon_1), &(tampon_2), &(((integer8 *) (*((struct_vecteur *) (*s_objet_resultat) .objet)).tableau)[0])); @@ -1146,9 +1204,7 @@ instruction_cross(struct_processus *s_et .tableau)[0]), &(((integer8 *) (*((struct_vecteur *) (*s_objet_argument_1).objet)).tableau)[2]), &(tampon_2)); - tampon_2 = -tampon_2; - - depassement |= depassement_addition(&(tampon_1), &(tampon_2), + depassement |= depassement_soustraction(&(tampon_1), &(tampon_2), &(((integer8 *) (*((struct_vecteur *) (*s_objet_resultat) .objet)).tableau)[1])); @@ -1162,9 +1218,7 @@ instruction_cross(struct_processus *s_et .tableau)[1]), &(((integer8 *) (*((struct_vecteur *) (*s_objet_argument_1).objet)).tableau)[0]), &(tampon_2)); - tampon_2 = -tampon_2; - - depassement |= depassement_addition(&(tampon_1), &(tampon_2), + depassement |= depassement_soustraction(&(tampon_1), &(tampon_2), &(((integer8 *) (*((struct_vecteur *) (*s_objet_resultat) .objet)).tableau)[2]));