--- rpl/src/instructions_m4.c 2011/11/26 10:01:29 1.36 +++ rpl/src/instructions_m4.c 2011/11/26 13:05:03 1.37 @@ -453,6 +453,8 @@ instruction_mtxlock(struct_processus *s_ return; } + (*((struct_mutex *) (*s_objet_argument).objet)).tid = pthread_self(); + # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) # else @@ -609,6 +611,8 @@ instruction_mtxtrylock(struct_processus } } + (*((struct_mutex *) (*s_objet_argument).objet)).tid = pthread_self(); + if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); @@ -642,6 +646,7 @@ instruction_mtxtrylock(struct_processus return; } + /* ================================================================================ Fonction 'mtxstatus' @@ -766,18 +771,23 @@ instruction_mtxstatus(struct_processus * } } - if (pthread_mutex_unlock(&((*((struct_mutex *) - (*s_objet_argument).objet)).mutex)) != 0) + if (ios == 0) { - liberation(s_etat_processus, s_objet_argument); + // Le mutex a été verrouillé par le trylock précédent. - if ((*s_etat_processus).profilage == d_vrai) + if (pthread_mutex_unlock(&((*((struct_mutex *) + (*s_objet_argument).objet)).mutex)) != 0) { - profilage(s_etat_processus, NULL); - } + liberation(s_etat_processus, s_objet_argument); - (*s_etat_processus).erreur_systeme = d_es_processus; - return; + if ((*s_etat_processus).profilage == d_vrai) + { + profilage(s_etat_processus, NULL); + } + + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } } if ((*s_etat_processus).profilage == d_vrai) @@ -891,9 +901,19 @@ instruction_mtxunlock(struct_processus * if (l_element_courant == NULL) { + liberation(s_etat_processus, s_objet_argument); + (*s_etat_processus).erreur_execution = d_ex_mutex; + return; + } + if (pthread_equal(pthread_self(), (*((struct_mutex *) + (*s_objet_argument).objet)).tid) == 0) + { liberation(s_etat_processus, s_objet_argument); + + (*s_etat_processus).erreur_execution = + d_ex_mutex_acquis_autre_thread; return; }