--- rpl/src/rpl.c 2012/05/21 17:25:46 1.114 +++ rpl/src/rpl.c 2012/09/15 12:57:09 1.117 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.9 + RPL/2 (R) version 4.1.10 Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -251,6 +251,11 @@ rplinit(int argc, char *argv[], char *en &attributs_mutex); pthread_mutexattr_destroy(&attributs_mutex); + pthread_mutexattr_init(&attributs_mutex); + pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&mutex_sections_critiques, &attributs_mutex); + pthread_mutexattr_destroy(&attributs_mutex); + # ifndef SEMAPHORES_NOMMES sem_init(&((*s_etat_processus).semaphore_fork), 0, 0); # else @@ -429,6 +434,14 @@ rplinit(int argc, char *argv[], char *en signal_test = SIGTEST; kill(getpid(), SIGINT); + attente.tv_sec = 0; + attente.tv_nsec = 1000000; + + for(i = 0; (i < 1000) && (signal_test == SIGTEST); i++) + { + nanosleep(&attente, NULL); + } + if (signal_test != SIGINT) { erreur = d_es_signal; @@ -466,6 +479,14 @@ rplinit(int argc, char *argv[], char *en signal_test = SIGTEST; kill(getpid(), SIGTERM); + attente.tv_sec = 0; + attente.tv_nsec = 1000000; + + for(i = 0; (i < 1000) && (signal_test == SIGTEST); i++) + { + nanosleep(&attente, NULL); + } + if (signal_test != SIGTERM) { erreur = d_es_signal; @@ -503,6 +524,14 @@ rplinit(int argc, char *argv[], char *en signal_test = SIGTEST; kill(getpid(), SIGALRM); + attente.tv_sec = 0; + attente.tv_nsec = 1000000; + + for(i = 0; (i < 1000) && (signal_test == SIGTEST); i++) + { + nanosleep(&attente, NULL); + } + if (signal_test != SIGALRM) { erreur = d_es_signal; @@ -541,6 +570,14 @@ rplinit(int argc, char *argv[], char *en signal_test = SIGTEST; kill(getpid(), SIGTSTP); + attente.tv_sec = 0; + attente.tv_nsec = 1000000; + + for(i = 0; (i < 1000) && (signal_test == SIGTEST); i++) + { + nanosleep(&attente, NULL); + } + if (signal_test != SIGTSTP) { erreur = d_es_signal; @@ -581,6 +618,14 @@ rplinit(int argc, char *argv[], char *en signal_test = SIGTEST; kill(getpid(), SIGPIPE); + attente.tv_sec = 0; + attente.tv_nsec = 1000000; + + for(i = 0; (i < 1000) && (signal_test == SIGTEST); i++) + { + nanosleep(&attente, NULL); + } + if (signal_test != SIGPIPE) { erreur = d_es_signal; @@ -621,6 +666,14 @@ rplinit(int argc, char *argv[], char *en signal_test = SIGTEST; kill(getpid(), SIGUSR1); + attente.tv_sec = 0; + attente.tv_nsec = 1000000; + + for(i = 0; (i < 1000) && (signal_test == SIGTEST); i++) + { + nanosleep(&attente, NULL); + } + if (signal_test != SIGUSR1) { erreur = d_es_signal; @@ -1590,6 +1643,14 @@ rplinit(int argc, char *argv[], char *en signal_test = SIGTEST; kill(getpid(), SIGSEGV); + attente.tv_sec = 0; + attente.tv_nsec = 1000000; + + for(i = 0; (i < 1000) && (signal_test == SIGTEST); i++) + { + nanosleep(&attente, NULL); + } + if (signal_test != SIGSEGV) { erreur = d_es_signal; @@ -1609,6 +1670,9 @@ rplinit(int argc, char *argv[], char *en } # endif + action.sa_handler = interruption3; + action.sa_flags = 0; + if (sigaction(SIGBUS, &action, NULL) != 0) { if ((*s_etat_processus).langue == 'F') @@ -1628,6 +1692,14 @@ rplinit(int argc, char *argv[], char *en signal_test = SIGTEST; kill(getpid(), SIGBUS); + attente.tv_sec = 0; + attente.tv_nsec = 1000000; + + for(i = 0; (i < 1000) && (signal_test == SIGTEST); i++) + { + nanosleep(&attente, NULL); + } + if (signal_test != SIGBUS) { erreur = d_es_signal; @@ -1861,6 +1933,7 @@ rplinit(int argc, char *argv[], char *en gettimeofday(&((*s_etat_processus).horodatage_profilage), NULL); (*s_etat_processus).liste_mutexes = NULL; + (*s_etat_processus).sections_critiques = 0; (*s_etat_processus).test_instruction = 'N'; (*s_etat_processus).nombre_arguments = 0; @@ -2843,6 +2916,11 @@ rplinit(int argc, char *argv[], char *en } } + for(i = 0; i < (*s_etat_processus).sections_critiques; i++) + { + pthread_mutex_unlock(&mutex_sections_critiques); + } + liberation(s_etat_processus, (*s_etat_processus).at_exit); liberation(s_etat_processus, (*s_etat_processus).at_poke); @@ -3636,6 +3714,7 @@ rplinit(int argc, char *argv[], char *en pthread_mutex_destroy(&((*s_etat_processus).mutex)); pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation)); + pthread_mutex_destroy(&mutex_sections_critiques); # ifndef SEMAPHORES_NOMMES sem_post(&((*s_etat_processus).semaphore_fork)); @@ -3648,9 +3727,6 @@ rplinit(int argc, char *argv[], char *en free((*s_etat_processus).localisation); - pthread_mutex_destroy(&mutex_liste_threads); - pthread_mutex_destroy(&mutex_gestionnaires_signaux_atomique); - # ifndef SEMAPHORES_NOMMES sem_post(&semaphore_gestionnaires_signaux); sem_destroy(&semaphore_gestionnaires_signaux);