--- rpl/src/instructions_d5.c 2016/03/09 10:57:41 1.139 +++ rpl/src/instructions_d5.c 2016/03/09 17:49:11 1.140 @@ -1094,6 +1094,8 @@ instruction_detach(struct_processus *s_e return; } + verrouillage_threads_concurrents(s_etat_processus); + if (pthread_mutex_lock(&((*s_etat_processus).mutex_allocation_buffer)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -1107,14 +1109,8 @@ instruction_detach(struct_processus *s_e * de mémoire, ni libération, ni copie d'objet concurrent au fork(). */ - verrouillage_threads_concurrents(s_etat_processus); (*s_argument_thread).pid = fork(); - if ((*s_argument_thread).pid > 0) - { - deverrouillage_threads_concurrents(s_etat_processus); - } - if (pthread_mutex_unlock(&((*s_etat_processus).mutex_allocation_buffer)) != 0) { @@ -1122,6 +1118,13 @@ instruction_detach(struct_processus *s_e return; } + if ((*s_argument_thread).pid > 0) + { + // On ne déverrouille les threads concurrents que dans le processus + // père. Dans le fils, les valeurs sont non initialisées. + deverrouillage_threads_concurrents(s_etat_processus); + } + (*s_argument_thread).thread_pere = pthread_self(); (*s_argument_thread).processus_detache = d_vrai;