--- rpl/src/instructions_m4.c 2012/12/18 13:19:37 1.50 +++ rpl/src/instructions_m4.c 2016/09/27 15:29:37 1.71 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.12 - Copyright (C) 1989-2012 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.26 + Copyright (C) 1989-2016 Dr. BERTRAND Joël This file is part of RPL/2. @@ -38,8 +38,8 @@ void instruction_mem(struct_processus *s_etat_processus) { - int j; - int nb_variables; + integer8 j; + integer8 nb_variables; struct_liste_chainee *l_element_courant; @@ -144,8 +144,8 @@ instruction_mem(struct_processus *s_etat nb_variables = nombre_variables(s_etat_processus); - if ((tableau = malloc(nb_variables * sizeof(struct_tableau_variables))) - == NULL) + if ((tableau = malloc(((size_t) nb_variables) * + sizeof(struct_tableau_variables))) == NULL) { liberation_mutexes_arbre_variables_partagees(s_etat_processus, (*(*s_etat_processus).s_arbre_variables_partagees)); @@ -153,16 +153,21 @@ instruction_mem(struct_processus *s_etat return; } - liste_variables(s_etat_processus, tableau); + nb_variables = liste_variables(s_etat_processus, tableau); for(j = 0; j < nb_variables; j++) { (*((integer8 *) (*((*((*((struct_liste_chainee *) (*s_objet_resultat) - .objet)).suivant)).donnee)).objet)) += sizeof(unsigned char) * - strlen(tableau[j].nom); + .objet)).suivant)).donnee)).objet)) += (integer8) + (sizeof(unsigned char) * strlen(tableau[j].nom)); (*((integer8 *) (*((*((*((struct_liste_chainee *) (*s_objet_resultat) .objet)).suivant)).donnee)).objet)) += occupation_memoire( tableau[j].objet); + + if(tableau[j].mutex != NULL) + { // La variable est une variable partagée. On libère le mutex. + pthread_mutex_unlock(tableau[j].mutex); + } } free(tableau); @@ -891,6 +896,15 @@ instruction_mtxunlock(struct_processus * { liberation(s_etat_processus, s_objet_argument); + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + + if (pthread_mutex_unlock(&((*((struct_mutex *) + (*s_objet_argument).objet)).mutex)) != 0) + { + liberation(s_etat_processus, s_objet_argument); + (*s_etat_processus).erreur_systeme = d_es_processus; return; }