--- rpl/src/rpl.c 2010/04/28 11:05:45 1.22 +++ rpl/src/rpl.c 2010/05/25 18:09:44 1.27 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.15 + RPL/2 (R) version 4.0.16 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. @@ -99,6 +99,10 @@ rplinit(int argc, char *argv[], unsigned volatile int erreur; volatile unsigned char traitement_fichier_temporaire; +# ifdef DEBUG_MEMOIRE + debug_memoire_initialisation(); +# endif + setvbuf(stdout, NULL, _IOLBF, 0); setvbuf(stderr, NULL, _IOLBF, 0); @@ -447,7 +451,7 @@ rplinit(int argc, char *argv[], unsigned return(EXIT_FAILURE); } - action.sa_sigaction = interruption5; + action.sa_sigaction = interruption11; action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; if (sigaction(SIGFABORT, &action, NULL) != 0) @@ -2864,13 +2868,6 @@ rplinit(int argc, char *argv[], unsigned l_element_courant = (void *) (*s_etat_processus).l_base_pile_processus; - if ((*s_etat_processus) - .nombre_interruptions_non_affectees != 0) - { - affectation_interruptions_logicielles( - s_etat_processus); - } - for(i = 0; i < (unsigned long) (*(*((struct_processus_fils *) (*(*((struct_liste_chainee *) @@ -2929,6 +2926,14 @@ rplinit(int argc, char *argv[], unsigned } pthread_mutex_unlock(&((*s_etat_processus).mutex)); + + if ((*s_etat_processus) + .nombre_interruptions_non_affectees != 0) + { + affectation_interruptions_logicielles( + s_etat_processus); + } + nanosleep(&attente, NULL); pthread_mutex_lock(&((*s_etat_processus).mutex)); } @@ -3452,6 +3457,8 @@ rplinit(int argc, char *argv[], unsigned } # ifndef Cygwin + (*s_etat_processus).pile_signal.ss_flags = SS_DISABLE; + sigaltstack(&((*s_etat_processus).pile_signal), NULL); free((*s_etat_processus).pile_signal.ss_sp); # endif @@ -3473,7 +3480,6 @@ rplinit(int argc, char *argv[], unsigned # endif free((*s_etat_processus).localisation); - free(s_etat_processus); # ifndef SEMAPHORES_NOMMES sem_destroy(&semaphore_liste_threads); @@ -3491,8 +3497,11 @@ rplinit(int argc, char *argv[], unsigned sem_gestionnaires_signaux_atomique); # endif + free(s_etat_processus); + # ifdef DEBUG_MEMOIRE - debug_memoire_verification(s_etat_processus); + debug_memoire_verification(); + analyse_post_mortem(); # endif return((erreur == d_absence_erreur) ? EXIT_SUCCESS : EXIT_FAILURE);