--- rpl/src/instructions_d5.c 2010/08/30 14:14:07 1.41 +++ rpl/src/instructions_d5.c 2010/12/14 15:46:24 1.45 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.19 + RPL/2 (R) version 4.0.20 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. @@ -1172,6 +1172,12 @@ instruction_detach(struct_processus *s_e pthread_mutex_init(&((*s_argument_thread).mutex), &attributs_mutex); pthread_mutexattr_destroy(&attributs_mutex); + pthread_mutexattr_init(&attributs_mutex); + pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&((*s_argument_thread).mutex_nombre_references), + &attributs_mutex); + pthread_mutexattr_destroy(&attributs_mutex); + if ((*s_argument_thread).pid > 0) { /* @@ -2856,8 +2862,11 @@ instruction_detach(struct_processus *s_e liberation(s_etat_processus, s_objet); # if !defined(Cygwin) && !defined(OpenBSD) - (*s_etat_processus).pile_signal.ss_flags = SS_DISABLE; - sigaltstack(&((*s_etat_processus).pile_signal), NULL); + do + { + (*s_etat_processus).pile_signal.ss_flags = SS_DISABLE; + } + while(sigaltstack(&((*s_etat_processus).pile_signal), NULL) != 0); free((*s_etat_processus).pile_signal.ss_sp); # endif @@ -3015,6 +3024,9 @@ instruction_detach(struct_processus *s_e // Être sûr que le processus fils soit déjà présent... + attente.tv_sec = 0; + attente.tv_nsec = GRANULARITE_us * 1000; + while(kill((*s_argument_thread).pid, 0) != 0) { //if ((errno != ESRCH) && (errno != EAGAIN)) @@ -3026,6 +3038,7 @@ instruction_detach(struct_processus *s_e } nanosleep(&attente, NULL); + INCR_GRANULARITE(attente.tv_nsec); } // Le fils peut être présent sans être en attente du signal de départ.