--- rpl/src/interruptions.c 2016/07/20 16:23:59 1.180 +++ rpl/src/interruptions.c 2016/07/22 14:44:11 1.182 @@ -93,9 +93,12 @@ thread_surveillance_signaux(void *argume if (sem_wait(semaphore_signalisation) == 0) { - if (sem_wait(semaphore_arret_signalisation) != 0) + while((ios = sem_wait(semaphore_arret_signalisation)) != 0) { - (*s_etat_processus).erreur_systeme = d_es_processus; + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + } } if ((*s_queue_signaux).requete_arret == d_vrai) @@ -3422,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) { @@ -3435,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) @@ -3519,7 +3522,15 @@ destruction_queue_signaux(struct_process unsigned char *nom; # endif - sem_wait(semaphore_arret_signalisation); + while(sem_wait(semaphore_arret_signalisation) != 0) + { + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } + (*s_queue_signaux).requete_arret = d_vrai; # ifndef IPCS_SYSV @@ -3531,7 +3542,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