--- rpl/src/gestion_threads.c 2013/05/21 12:10:12 1.79 +++ rpl/src/gestion_threads.c 2013/06/21 14:15:52 1.84 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.14 + RPL/2 (R) version 4.1.15 Copyright (C) 1989-2013 Dr. BERTRAND Joël This file is part of RPL/2. @@ -89,8 +89,21 @@ lancement_thread(void *argument) (*s_argument_thread).tid = pthread_self(); insertion_thread(s_etat_processus, d_faux); + + if (pthread_mutex_lock(&((*s_argument_thread).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return(NULL); + } + (*s_argument_thread).thread_actif = d_vrai; + if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return(NULL); + } + // Envoi d'une donnée pour signaler le démarrage du thread au thread // de surveillance. @@ -367,7 +380,7 @@ lancement_thread(void *argument) l_element_courant = l_element_suivant; } - pthread_mutex_lock(&((*s_etat_processus).mutex)); + pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus)); l_element_courant = (struct_liste_chainee *) (*s_etat_processus).l_base_pile_processus; @@ -453,7 +466,8 @@ lancement_thread(void *argument) (*(*l_element_courant).donnee).objet)).thread).mutex)) != 0) { - pthread_mutex_unlock(&((*s_etat_processus).mutex)); + pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)); (*s_etat_processus).erreur_systeme = d_es_processus; pthread_mutex_lock(&((*s_argument_thread).mutex)); @@ -477,7 +491,8 @@ lancement_thread(void *argument) (*(*l_element_courant).donnee).objet)).thread) .mutex)) != 0) { - pthread_mutex_unlock(&((*s_etat_processus).mutex)); + pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)); (*s_etat_processus).erreur_systeme = d_es_processus; pthread_mutex_lock(&((*s_argument_thread).mutex)); @@ -494,7 +509,8 @@ lancement_thread(void *argument) (*(*l_element_courant).donnee).objet)).thread).mutex)) != 0) { - pthread_mutex_unlock(&((*s_etat_processus).mutex)); + pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)); (*s_etat_processus).erreur_systeme = d_es_processus; pthread_mutex_lock(&((*s_argument_thread).mutex)); @@ -527,7 +543,8 @@ lancement_thread(void *argument) (*(*l_element_courant).donnee).objet)).thread).mutex)) != 0) { - pthread_mutex_unlock(&((*s_etat_processus).mutex)); + pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)); (*s_etat_processus).erreur_systeme = d_es_processus; pthread_mutex_lock(&((*s_argument_thread).mutex)); @@ -582,7 +599,8 @@ lancement_thread(void *argument) if (sigaction(SIGPIPE, &action, ®istre) != 0) { - pthread_mutex_unlock(&((*s_etat_processus).mutex)); + pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)); if (registre_stop == 0) { @@ -633,7 +651,8 @@ lancement_thread(void *argument) if (sigaction(SIGPIPE, ®istre, NULL) != 0) { - pthread_mutex_unlock(&((*s_etat_processus).mutex)); + pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)); (*s_etat_processus).erreur_systeme = d_es_signal; exit(EXIT_FAILURE); @@ -651,18 +670,34 @@ lancement_thread(void *argument) } } - pthread_mutex_unlock(&((*s_etat_processus).mutex)); + if (pthread_mutex_lock(&((*s_etat_processus).mutex_interruptions)) != 0) + { + pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus)); + + (*s_etat_processus).erreur_systeme = d_es_processus; + exit(EXIT_FAILURE); + } if ((*s_etat_processus).nombre_interruptions_non_affectees != 0) { affectation_interruptions_logicielles(s_etat_processus); } + if (pthread_mutex_unlock(&((*s_etat_processus).mutex_interruptions)) + != 0) + { + pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus)); + + (*s_etat_processus).erreur_systeme = d_es_processus; + exit(EXIT_FAILURE); + } + + pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus)); nanosleep(&attente, NULL); - pthread_mutex_lock(&((*s_etat_processus).mutex)); + pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus)); } - pthread_mutex_unlock(&((*s_etat_processus).mutex)); + pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus)); l_element_courant = (*s_etat_processus).s_sockets; @@ -983,8 +1018,10 @@ lancement_thread(void *argument) liberation_allocateur(s_etat_processus); retrait_thread(s_etat_processus); - pthread_mutex_destroy(&((*s_etat_processus).mutex)); + pthread_mutex_destroy(&((*s_etat_processus).mutex_pile_processus)); pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation)); + pthread_mutex_destroy(&((*s_etat_processus).mutex_interruptions)); + pthread_mutex_destroy(&((*s_etat_processus).mutex_signaux)); # ifndef SEMAPHORES_NOMMES sem_destroy(&((*s_etat_processus).semaphore_fork)); @@ -998,9 +1035,9 @@ lancement_thread(void *argument) free(s_etat_processus); pthread_mutex_lock(&((*s_argument_thread).mutex)); + (*s_argument_thread).thread_actif = d_faux; pthread_mutex_unlock(&((*s_argument_thread).mutex)); - (*s_argument_thread).thread_actif = d_faux; pthread_exit(NULL); return(NULL); }