--- rpl/src/gestion_threads.c 2019/02/09 13:36:37 1.112 +++ rpl/src/gestion_threads.c 2020/01/10 11:15:43 1.116 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.31 - Copyright (C) 1989-2019 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.32 + Copyright (C) 1989-2020 Dr. BERTRAND Joël This file is part of RPL/2. @@ -77,15 +77,15 @@ lancement_thread(void *argument) s_etat_processus = (*s_argument_thread).s_nouvel_etat_processus; # 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) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - pthread_exit(NULL); - } # endif + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + pthread_exit(NULL); + } (*s_argument_thread).tid = pthread_self(); insertion_thread(s_etat_processus, d_faux); @@ -604,11 +604,18 @@ lancement_thread(void *argument) (*(*((struct_processus_fils *) (*(*l_element_courant) .donnee).objet)).thread).nombre_objets_dans_pipe--; + if (pthread_mutex_lock(&mutex_sigaction) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + pthread_exit(NULL); + } + action.sa_handler = SIG_IGN; action.sa_flags = 0; if (sigaction(SIGPIPE, &action, ®istre) != 0) { + pthread_mutex_unlock(&mutex_sigaction); pthread_mutex_unlock(&((*s_etat_processus) .mutex_pile_processus)); @@ -628,7 +635,7 @@ lancement_thread(void *argument) } (*s_etat_processus).erreur_systeme = d_es_signal; - exit(EXIT_FAILURE); + pthread_exit(NULL); } while((longueur_ecriture = write_atomic( @@ -661,11 +668,21 @@ lancement_thread(void *argument) if (sigaction(SIGPIPE, ®istre, NULL) != 0) { + pthread_mutex_unlock(&mutex_sigaction); pthread_mutex_unlock(&((*s_etat_processus) .mutex_pile_processus)); (*s_etat_processus).erreur_systeme = d_es_signal; - exit(EXIT_FAILURE); + pthread_exit(NULL); + } + + if (pthread_mutex_unlock(&mutex_sigaction) != 0) + { + pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)); + + (*s_etat_processus).erreur_systeme = d_es_signal; + pthread_exit(NULL); } } } @@ -685,7 +702,7 @@ lancement_thread(void *argument) pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus)); (*s_etat_processus).erreur_systeme = d_es_processus; - exit(EXIT_FAILURE); + pthread_exit(NULL); } if ((*s_etat_processus).nombre_interruptions_non_affectees != 0) @@ -699,7 +716,7 @@ lancement_thread(void *argument) pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus)); (*s_etat_processus).erreur_systeme = d_es_processus; - exit(EXIT_FAILURE); + pthread_exit(NULL); } pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus)); @@ -1060,7 +1077,6 @@ lancement_thread(void *argument) pthread_mutex_unlock(&((*s_argument_thread).mutex)); pthread_exit(NULL); - return(NULL); } // vim: ts=4