--- rpl/src/gestion_objets.c 2010/06/02 10:28:45 1.22 +++ rpl/src/gestion_objets.c 2010/06/08 10:22:36 1.24 @@ -1110,9 +1110,21 @@ liberation(struct_processus *s_etat_proc case PRC : { + if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + if (pthread_mutex_lock(&((*(*((struct_processus_fils *) (*s_objet).objet)).thread).mutex)) != 0) { + if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + (*s_etat_processus).erreur_systeme = d_es_processus; return; } @@ -1121,7 +1133,8 @@ liberation(struct_processus *s_etat_proc .nombre_references--; BUG((*(*((struct_processus_fils *) (*s_objet).objet)).thread) - .nombre_references < 0, printf("(*(*((struct_processus_fils" + .nombre_references < 0, uprintf( + "(*(*((struct_processus_fils" " *) (*s_objet).objet)).thread).nombre_references = %d\n", (int) (*(*((struct_processus_fils *) (*s_objet).objet)) .thread).nombre_references)); @@ -1139,6 +1152,12 @@ liberation(struct_processus *s_etat_proc if (pthread_mutex_unlock(&((*(*((struct_processus_fils *) (*s_objet).objet)).thread).mutex)) != 0) { + if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + (*s_etat_processus).erreur_systeme = d_es_processus; return; } @@ -1150,6 +1169,12 @@ liberation(struct_processus *s_etat_proc free((*((struct_processus_fils *) (*s_objet).objet)).thread); } + if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + if (decrementation_atomique(s_objet) > 0) { return; @@ -2239,9 +2264,19 @@ copie_objet(struct_processus *s_etat_pro case PRC : { + if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0) + { + return(NULL); + } + if (pthread_mutex_lock(&((*(*((struct_processus_fils *) (*s_objet).objet)).thread).mutex)) != 0) { + if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) + { + return(NULL); + } + return(NULL); } @@ -2251,22 +2286,44 @@ copie_objet(struct_processus *s_etat_pro if (pthread_mutex_unlock(&((*(*((struct_processus_fils *) (*s_objet).objet)).thread).mutex)) != 0) { + if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) + { + return(NULL); + } + return(NULL); } if (type != 'O') { incrementation_atomique(s_objet); + + if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) + { + return(NULL); + } + return(s_objet); } if ((s_nouvel_objet = allocation(s_etat_processus, PRC)) == NULL) { + if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) + { + return(NULL); + } + return(NULL); } (*((struct_processus_fils *) (*s_nouvel_objet).objet)) = (*((struct_processus_fils *) (*s_objet).objet)); + + if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) + { + return(NULL); + } + break; }