--- rpl/src/interruptions.c 2016/07/21 15:22:53 1.181 +++ rpl/src/interruptions.c 2016/07/22 15:08:43 1.184 @@ -3425,6 +3425,8 @@ creation_queue_signaux(struct_processus return; } + (*s_queue_signaux).controle = getpid(); + if (pthread_create(&((*s_queue_signaux).thread_signaux), &attributs, thread_surveillance_signaux, s_etat_processus) != 0) { @@ -3438,8 +3440,6 @@ creation_queue_signaux(struct_processus return; } - (*s_queue_signaux).controle = getpid(); - # ifndef IPCS_SYSV if (msync(s_queue_signaux, sizeof(s_queue_signaux), MS_ASYNC | MS_INVALIDATE) != 0) @@ -3522,6 +3522,11 @@ destruction_queue_signaux(struct_process unsigned char *nom; # endif + // On dépile les interruptions pour arrêter les SIGALRM sur + // le processus courant. + + scrutation_interruptions(s_etat_processus); + while(sem_wait(semaphore_arret_signalisation) != 0) { if (errno != EINTR) @@ -3542,7 +3547,17 @@ destruction_queue_signaux(struct_process // Incrémenter le sémaphore pour être sûr de le débloquer. sem_post(semaphore_signalisation); - pthread_join((*s_queue_signaux).thread_signaux, NULL); + + if ((*s_queue_signaux).controle == getpid()) + { + pthread_join((*s_queue_signaux).thread_signaux, NULL); + } + else + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + arret_thread_signaux(s_etat_processus); # ifdef IPCS_SYSV // SystemV