--- rpl/src/interruptions.c 2016/08/26 08:57:56 1.185 +++ rpl/src/interruptions.c 2017/08/02 15:02:56 1.194 @@ -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.27 + Copyright (C) 1989-2017 Dr. BERTRAND Joël This file is part of RPL/2. @@ -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 @@ -3205,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 @@ -3416,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) @@ -3431,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) { @@ -3453,7 +3460,7 @@ creation_queue_signaux(struct_processus (*s_etat_processus).erreur_systeme = d_es_processus; return; } -# endif +# endif return; } @@ -3558,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. @@ -3656,7 +3665,6 @@ destruction_queue_signaux(struct_process sys_free(nom); # endif - arret_thread_signaux(s_etat_processus); return; }