--- rpl/src/instructions_d5.c 2011/09/14 14:34:28 1.67 +++ rpl/src/instructions_d5.c 2011/09/21 09:09:22 1.74 @@ -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; @@ -1275,10 +1277,20 @@ instruction_detach(struct_processus *s_e liberation_queue_signaux(s_etat_processus); creation_queue_signaux(s_etat_processus); + routine_recursive = 0; (*s_etat_processus).pointeur_signal_lecture = 0; (*s_etat_processus).pointeur_signal_ecriture = 0; - (*s_etat_processus).tid_courant = pthread_self(); + + 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 & @@ -1298,65 +1310,6 @@ instruction_detach(struct_processus *s_e fflush(stdout); } -# ifndef SEMAPHORES_NOMMES - sem_post(&semaphore_gestionnaires_signaux); - sem_destroy(&semaphore_gestionnaires_signaux); - sem_init(&semaphore_gestionnaires_signaux, 0, 0); -# else - sem_post(semaphore_gestionnaires_signaux); - sem_destroy2(semaphore_gestionnaires_signaux, - sem_gestionnaires_signaux); - - if ((semaphore_gestionnaires_signaux = sem_init2(0, - sem_gestionnaires_signaux)) == SEM_FAILED) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - } -# endif - -# ifndef SEMAPHORES_NOMMES - sem_post(&semaphore_liste_threads); - sem_destroy(&semaphore_liste_threads); - sem_init(&semaphore_liste_threads, 0, 1); -# else - sem_post(semaphore_liste_threads); - sem_destroy2(semaphore_liste_threads, sem_liste_threads); - - if ((semaphore_liste_threads = sem_init2(1, - sem_liste_threads)) == SEM_FAILED) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - } -# endif - -# ifndef SEMAPHORES_NOMMES - sem_destroy(&semaphore_gestionnaires_signaux_atomique); - sem_init(&semaphore_gestionnaires_signaux_atomique, 0, 1); - sem_trywait(&((*s_etat_processus).semaphore_fork)); -# else - sem_destroy2(semaphore_gestionnaires_signaux_atomique, - sem_gestionnaires_signaux_atomique); - - if ((semaphore_gestionnaires_signaux_atomique = sem_init2(1, - sem_gestionnaires_signaux_atomique)) == SEM_FAILED) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - } - - sem_trywait((*s_etat_processus).semaphore_fork); -# endif - -# ifndef SEMAPHORES_NOMMES - if (pthread_setspecific(semaphore_fork_processus_courant, - &((*s_etat_processus).semaphore_fork)) != 0) -# else - if (pthread_setspecific(semaphore_fork_processus_courant, - (*s_etat_processus).semaphore_fork) != 0) -# endif - { - (*s_etat_processus).erreur_systeme = d_es_processus; - } - if (close((*s_argument_thread).pipe_erreurs[0]) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -2478,6 +2431,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)); @@ -2814,33 +2769,18 @@ instruction_detach(struct_processus *s_e pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation)); pthread_mutex_destroy(&((*s_etat_processus).protection_liste_mutexes)); - pthread_key_delete(semaphore_fork_processus_courant); - # ifndef SEMAPHORES_NOMMES sem_post(&((*s_etat_processus).semaphore_fork)); sem_destroy(&((*s_etat_processus).semaphore_fork)); # else sem_post((*s_etat_processus).semaphore_fork); - sem_destroy2((*s_etat_processus).semaphore_fork, sem_fork); + sem_destroy3((*s_etat_processus).semaphore_fork, getpid(), + pthread_self(), SEM_FORK); # endif free((*s_etat_processus).localisation); free(s_argument_thread); -# ifndef SEMAPHORES_NOMMES - sem_destroy(&semaphore_liste_threads); - sem_post(&semaphore_gestionnaires_signaux); - sem_destroy(&semaphore_gestionnaires_signaux); - sem_destroy(&semaphore_gestionnaires_signaux_atomique); -# else - sem_destroy2(semaphore_liste_threads, sem_liste_threads); - sem_post(semaphore_gestionnaires_signaux); - sem_destroy2(semaphore_gestionnaires_signaux, - sem_gestionnaires_signaux); - sem_destroy2(semaphore_gestionnaires_signaux_atomique, - sem_gestionnaires_signaux_atomique); -# endif - clear_history(); destruction_queue_signaux(s_etat_processus); @@ -2903,6 +2843,7 @@ instruction_detach(struct_processus *s_e } } + scrutation_interruptions(s_etat_processus); l_element_courant = (*l_element_courant).suivant; } } while(drapeau == d_vrai); @@ -2922,25 +2863,24 @@ instruction_detach(struct_processus *s_e return; } - // Être sûr que le processus fils soit déjà présent... + // 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(kill((*s_argument_thread).pid, 0) != 0) + while(read_atomic(s_etat_processus, + pipe_initialisation_segment_signaux[0], + &caractere, sizeof(caractere)) == 0) { - //if ((errno != ESRCH) && (errno != EAGAIN)) - if (errno != ESRCH) - { - (*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); } + close(pipe_initialisation_segment_signaux[0]); + close(pipe_initialisation_segment_signaux[1]); + // Le fils peut être présent sans être en attente du signal de départ. if (envoi_signal_processus((*s_argument_thread).pid, rpl_sigstart) != 0)