--- rpl/src/instructions_d5.c 2011/09/14 17:55:59 1.68 +++ rpl/src/instructions_d5.c 2011/09/15 17:51:43 1.69 @@ -814,6 +814,8 @@ instruction_der(struct_processus *s_etat void instruction_detach(struct_processus *s_etat_processus) { + int pipe_initialisation_segment_signaux[2]; + logical1 drapeau; logical1 variable_partagee; @@ -828,9 +830,6 @@ instruction_detach(struct_processus *s_e sig_atomic_t registre_stop; - sigset_t oldset; - sigset_t set; - ssize_t longueur_ecriture; struct_descripteur_thread *s_argument_thread; @@ -850,6 +849,7 @@ instruction_detach(struct_processus *s_e struct timespec attente; + unsigned char caractere; unsigned char *message; unsigned int erreur; @@ -1085,6 +1085,12 @@ instruction_detach(struct_processus *s_e return; } + if (pipe(pipe_initialisation_segment_signaux) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + ppid = getpid(); /* @@ -1104,13 +1110,9 @@ instruction_detach(struct_processus *s_e * de mémoire, ni libération, ni copie d'objet concurrent au fork(). */ - sigfillset(&set); - pthread_sigmask(SIG_BLOCK, &set, &oldset); verrouillage_threads_concurrents(s_etat_processus); (*s_argument_thread).pid = fork(); deverrouillage_threads_concurrents(s_etat_processus); - pthread_sigmask(SIG_SETMASK, &oldset, NULL); - sigpending(&set); (*s_argument_thread).thread_pere = pthread_self(); (*s_argument_thread).processus_detache = d_vrai; @@ -1279,6 +1281,16 @@ instruction_detach(struct_processus *s_e (*s_etat_processus).pointeur_signal_lecture = 0; (*s_etat_processus).pointeur_signal_ecriture = 0; + if (write_atomic(s_etat_processus, + pipe_initialisation_segment_signaux[1], + "-", sizeof(unsigned char)) != sizeof(unsigned char)) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + } + + close(pipe_initialisation_segment_signaux[0]); + close(pipe_initialisation_segment_signaux[1]); + if ((*s_etat_processus).debug == d_vrai) if (((*s_etat_processus).type_debug & d_debug_processus) != 0) @@ -2418,6 +2430,8 @@ instruction_detach(struct_processus *s_e nanosleep(&attente, NULL); pthread_mutex_lock(&((*s_etat_processus).mutex)); + + scrutation_interruptions(s_etat_processus); } pthread_mutex_unlock(&((*s_etat_processus).mutex)); @@ -2822,6 +2836,7 @@ instruction_detach(struct_processus *s_e } } + scrutation_interruptions(s_etat_processus); l_element_courant = (*l_element_courant).suivant; } } while(drapeau == d_vrai); @@ -2841,21 +2856,39 @@ instruction_detach(struct_processus *s_e return; } + // On attend une donnée fictive pour être sûr que le segment de mémoire + // partagée destiné à la gestion des signaux est bien initialisé. + + attente.tv_sec = 0; + attente.tv_nsec = GRANULARITE_us * 1000; + + while(read_atomic(s_etat_processus, + pipe_initialisation_segment_signaux[0], + &caractere, sizeof(caractere)) == 0) + { + scrutation_interruptions(s_etat_processus); + nanosleep(&attente, NULL); + INCR_GRANULARITE(attente.tv_nsec); + } + + close(pipe_initialisation_segment_signaux[0]); + close(pipe_initialisation_segment_signaux[1]); + // Ê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) + while(envoi_signal_processus((*s_argument_thread).pid, rpl_signull) != 0) { - //if ((errno != ESRCH) && (errno != EAGAIN)) - if (errno != ESRCH) + if (errno != ENOENT) { (*s_etat_processus).erreur_systeme = d_es_processus; pthread_mutex_unlock(&((*s_etat_processus).mutex)); return; } + scrutation_interruptions(s_etat_processus); nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); }