--- rpl/src/rpl.c 2018/01/01 10:34:06 1.201 +++ rpl/src/rpl.c 2023/08/07 14:32:56 1.219 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.28 - Copyright (C) 1989-2017 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.34 + Copyright (C) 1989-2021 Dr. BERTRAND Joël This file is part of RPL/2. @@ -127,7 +127,7 @@ rplinit(int argc, char *argv[], char *en errno = 0; s_queue_signaux = NULL; routine_recursive = 0; - nombre_thread_surveillance_processus = 0; + nombre_threads_surveillance_processus = 0; pid_processus_pere = getpid(); # ifdef DEBUG_PROC @@ -313,26 +313,36 @@ rplinit(int argc, char *argv[], char *en pthread_mutex_init(&mutex_liste_threads, &attributs_mutex); pthread_mutexattr_destroy(&attributs_mutex); + pthread_mutexattr_init(&attributs_mutex); + pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&mutex_liste_threads_surveillance, &attributs_mutex); + pthread_mutexattr_destroy(&attributs_mutex); + + pthread_mutexattr_init(&attributs_mutex); + pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&mutex_sigaction, &attributs_mutex); + pthread_mutexattr_destroy(&attributs_mutex); + # ifndef SEMAPHORES_NOMMES - sem_init(&((*s_etat_processus).semaphore_fork), 0, 0); + if (sem_init(&((*s_etat_processus).semaphore_fork), 0, 0) != 0) # else if (((*s_etat_processus).semaphore_fork = sem_init3(0, getpid(), pthread_self(), SEM_FORK)) == SEM_FAILED) - { - liberation_contexte_cas(s_etat_processus); - - if ((*s_etat_processus).langue == 'F') - { - uprintf("+++Système : Mémoire insuffisante\n"); - } - else - { - uprintf("+++System : Not enough memory\n"); - } +# endif + { + liberation_contexte_cas(s_etat_processus); - return(EXIT_FAILURE); + if ((*s_etat_processus).langue == 'F') + { + uprintf("+++Système : Mémoire insuffisante\n"); + } + else + { + uprintf("+++System : Not enough memory\n"); } -# endif + + return(EXIT_FAILURE); + } pthread_mutexattr_init(&attributs_mutex); pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL); @@ -449,11 +459,11 @@ rplinit(int argc, char *argv[], char *en if ((*s_etat_processus).langue == 'F') { - printf("+++Copyright (C) 1989 à 2017, 2018 BERTRAND Joël\n"); + printf("+++Copyright (C) 1989 à 2022, 2023 BERTRAND Joël\n"); } else { - printf("+++Copyright (C) 1989 to 2017, 2018 BERTRAND Joel\n"); + printf("+++Copyright (C) 1989 to 2022, 2023 BERTRAND Joel\n"); } } @@ -5433,7 +5443,7 @@ rplinit(int argc, char *argv[], char *en if ((*s_etat_processus).var_volatile_alarme != 0) { - envoi_signal_thread( + envoi_signal_thread(s_etat_processus, (*(*((struct_processus_fils *) (*(*((struct_liste_chainee *) l_element_courant)).donnee).objet)) @@ -5444,7 +5454,7 @@ rplinit(int argc, char *argv[], char *en if ((*s_etat_processus).arret_depuis_abort == -1) { - envoi_signal_thread( + envoi_signal_thread(s_etat_processus, (*(*((struct_processus_fils *) (*(*((struct_liste_chainee *) l_element_courant)).donnee) @@ -5453,7 +5463,7 @@ rplinit(int argc, char *argv[], char *en } else { - envoi_signal_thread( + envoi_signal_thread(s_etat_processus, (*(*((struct_processus_fils *) (*(*((struct_liste_chainee *) l_element_courant)).donnee) @@ -6110,12 +6120,18 @@ rplinit(int argc, char *argv[], char *en attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; - while(nombre_thread_surveillance_processus != 0) + pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus)); + + while(nombre_threads_surveillance_processus != 0) { + pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus)); nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); + pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus)); } + pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus)); + attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; @@ -6165,6 +6181,8 @@ rplinit(int argc, char *argv[], char *en liberation_allocateur_buffer(s_etat_processus); pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation_buffer)); pthread_mutex_destroy(&mutex_liste_threads); + pthread_mutex_destroy(&mutex_liste_threads_surveillance); + pthread_mutex_destroy(&mutex_sigaction); sys_free(s_etat_processus); sys_free(arg_exec);