--- rpl/src/interruptions.c 2016/10/11 11:30:30 1.187 +++ rpl/src/interruptions.c 2018/05/30 09:27:38 1.197 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.26 - Copyright (C) 1989-2016 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.29 + Copyright (C) 1989-2018 Dr. BERTRAND Joël This file is part of RPL/2. @@ -2028,7 +2028,7 @@ sortie_interruption_depassement_pile(voi return; } -#ifndef BROKEN_SIGSEGV +#ifdef HAVE_SIGSEGV_RECOVERY void interruption_depassement_pile(int urgence, stackoverflow_context_t scp) { @@ -2059,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 @@ -3207,12 +3212,6 @@ creation_queue_signaux(struct_processus unsigned char *nom; - if (lancement_thread_signaux(s_etat_processus) == d_erreur) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - racine_segment = (*s_etat_processus).chemin_fichiers_temporaires; # ifndef IPCS_SYSV // POSIX @@ -3418,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) @@ -3433,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) { @@ -3455,7 +3460,7 @@ creation_queue_signaux(struct_processus (*s_etat_processus).erreur_systeme = d_es_processus; return; } -# endif +# endif return; } @@ -3560,6 +3565,8 @@ destruction_queue_signaux(struct_process return; } + arret_thread_signaux(s_etat_processus); + # ifdef IPCS_SYSV // SystemV # ifndef OS2 // Il faut commencer par éliminer le sémaphore. @@ -3658,7 +3665,6 @@ destruction_queue_signaux(struct_process sys_free(nom); # endif - arret_thread_signaux(s_etat_processus); return; }