--- rpl/src/interruptions.c 2016/07/22 14:44:11 1.182 +++ rpl/src/interruptions.c 2018/12/24 15:56:35 1.198 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.25 - Copyright (C) 1989-2016 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.30 + Copyright (C) 1989-2018 Dr. BERTRAND Joël This file is part of RPL/2. @@ -65,7 +65,7 @@ thread_surveillance_signaux(void *argume { // Cette fonction est lancée dans un thread créé par processus pour // gérer le cas des appels système qui seraient bloqués lors de l'arrivée du - // signal SIGALRM. Les processus externes n'envoient plus un signal au + // signal SIGUSR2. Les processus externes n'envoient plus un signal au // processus ou au thread à signaler mais positionnent les informations // nécessaires dans la queue des signaux et incrémentent le sémaphore. // Le sémaphore est décrémenté lorsque le signal est effectivement traité. @@ -135,7 +135,7 @@ thread_surveillance_signaux(void *argume // appels système lents. nombre_signaux_envoyes++; - kill(getpid(), SIGALRM); + kill(getpid(), SIGUSR2); sched_yield(); } @@ -168,7 +168,7 @@ thread_surveillance_signaux(void *argume { nombre_signaux_envoyes++; pthread_kill((*((struct_thread *) - (*l_element_courant).donnee)).tid, SIGALRM); + (*l_element_courant).donnee)).tid, SIGUSR2); sched_yield(); } @@ -1629,7 +1629,7 @@ thread_signaux(void *argument) if (signal != (0xFF & rpl_sigmax)) { envoi_signal_processus(getpid(), signal, d_faux); - // Un signal SIGALRM est envoyé par le thread de surveillance + // Un signal SIGUSR2 est envoyé par le thread de surveillance // des signaux jusqu'à ce que les signaux soient tous traités. } } while(signal != (0xFF & rpl_sigmax)); @@ -1685,7 +1685,7 @@ interruption1(int signal) break; default: - // SIGALRM + // SIGUSR2 break; } @@ -2028,6 +2028,7 @@ sortie_interruption_depassement_pile(voi return; } +#ifdef HAVE_SIGSEGV_RECOVERY void interruption_depassement_pile(int urgence, stackoverflow_context_t scp) { @@ -2044,6 +2045,7 @@ interruption_depassement_pile(int urgenc interruption3(SIGUSR2); return; } +#endif int interruption_violation_access(void *adresse_fautive, int gravite) @@ -2057,8 +2059,13 @@ interruption_violation_access(void *adre { // Il peut s'agir d'un dépassement de pile. - sigsegv_leave_handler(sortie_interruption_depassement_pile, - (void *) &routine_recursive, NULL, NULL); +# ifdef HAVE_SIGSEGV_RECOVERY + sigsegv_leave_handler(sortie_interruption_depassement_pile, + (void *) &routine_recursive, NULL, NULL); +# else + sortie_interruption_depassement_pile((void *) &routine_recursive, + NULL, NULL); +# endif } // On est dans une bonne vieille violation d'accès. On essaie @@ -3410,6 +3417,14 @@ creation_queue_signaux(struct_processus # endif # endif + (*s_queue_signaux).controle = getpid(); + + if (lancement_thread_signaux(s_etat_processus) == d_erreur) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + // Lancement du thread de récupération des signaux. if (pthread_attr_init(&attributs) != 0) @@ -3425,8 +3440,6 @@ 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) { @@ -3447,13 +3460,7 @@ creation_queue_signaux(struct_processus (*s_etat_processus).erreur_systeme = d_es_processus; return; } -# endif - - if (lancement_thread_signaux(s_etat_processus) == d_erreur) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } +# endif return; } @@ -3522,6 +3529,11 @@ destruction_queue_signaux(struct_process unsigned char *nom; # endif + // On dépile les interruptions pour arrêter les SIGUSR2 sur + // le processus courant. + + scrutation_interruptions(s_etat_processus); + while(sem_wait(semaphore_arret_signalisation) != 0) { if (errno != EINTR)