--- rpl/src/gestion_objets.c 2010/06/04 07:48:19 1.23 +++ 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,12 +1133,12 @@ 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)); -printf("liberation : %d\n", (*(*((struct_processus_fils *) (*s_objet).objet)).thread).nombre_references); if ((*(*((struct_processus_fils *) (*s_objet).objet)).thread) .nombre_references == 0) { @@ -1140,6 +1152,12 @@ printf("liberation : %d\n", (*(*((struct 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; } @@ -1151,6 +1169,12 @@ printf("liberation : %d\n", (*(*((struct 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; @@ -2240,35 +2264,66 @@ 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); } (*(*((struct_processus_fils *) (*s_objet).objet)).thread) .nombre_references++; -printf("<2> +1 %d\n", (*(*((struct_processus_fils *) (*s_objet).objet)).thread).nombre_references); 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; }