--- rpl/src/instructions_m4.c 2013/03/20 22:24:36 1.54 +++ rpl/src/instructions_m4.c 2013/03/23 16:14:39 1.55 @@ -142,6 +142,12 @@ instruction_mem(struct_processus *s_etat (*((integer8 *) (*((*((*((struct_liste_chainee *) (*s_objet_resultat).objet)).suivant)).donnee)).objet)) = 0; + if (pthread_mutex_lock(&mutex_liste_variables_partagees) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + nb_variables = nombre_variables(s_etat_processus); if ((tableau = malloc(((size_t) nb_variables) * @@ -149,11 +155,18 @@ instruction_mem(struct_processus *s_etat { liberation_mutexes_arbre_variables_partagees(s_etat_processus, (*(*s_etat_processus).s_arbre_variables_partagees)); + pthread_mutex_unlock(&mutex_liste_variables_partagees); (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } - liste_variables(s_etat_processus, tableau); + nb_variables = liste_variables(s_etat_processus, tableau); + + if (pthread_mutex_unlock(&mutex_liste_variables_partagees) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } for(j = 0; j < nb_variables; j++) { @@ -163,6 +176,11 @@ instruction_mem(struct_processus *s_etat (*((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);