--- rpl/src/interruptions.c 2019/02/11 06:18:20 1.202 +++ rpl/src/interruptions.c 2019/02/28 12:40:40 1.203 @@ -297,7 +297,7 @@ insertion_thread_surveillance(struct_pro return; } - if (pthread_mutex_lock(&mutex_liste_threads) != 0) + if (pthread_mutex_lock(&mutex_liste_threads_surveillance) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -312,7 +312,7 @@ insertion_thread_surveillance(struct_pro liste_threads_surveillance = l_nouvel_objet; - if (pthread_mutex_unlock(&mutex_liste_threads) != 0) + if (pthread_mutex_unlock(&mutex_liste_threads_surveillance) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -435,7 +435,7 @@ retrait_thread_surveillance(struct_proce volatile struct_liste_chainee_volatile *l_element_precedent; volatile struct_liste_chainee_volatile *l_element_courant; - if (pthread_mutex_lock(&mutex_liste_threads) != 0) + if (pthread_mutex_lock(&mutex_liste_threads_surveillance) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -457,7 +457,7 @@ retrait_thread_surveillance(struct_proce if (l_element_courant == NULL) { - pthread_mutex_unlock(&mutex_liste_threads); + pthread_mutex_unlock(&mutex_liste_threads_surveillance); (*s_etat_processus).erreur_systeme = d_es_processus; return; } @@ -474,7 +474,7 @@ retrait_thread_surveillance(struct_proce if (pthread_mutex_lock(&((*s_argument_thread).mutex_nombre_references)) != 0) { - pthread_mutex_unlock(&mutex_liste_threads); + pthread_mutex_unlock(&mutex_liste_threads_surveillance); (*s_etat_processus).erreur_systeme = d_es_processus; return; } @@ -490,7 +490,7 @@ retrait_thread_surveillance(struct_proce if (pthread_mutex_unlock(&((*s_argument_thread) .mutex_nombre_references)) != 0) { - pthread_mutex_unlock(&mutex_liste_threads); + pthread_mutex_unlock(&mutex_liste_threads_surveillance); (*s_etat_processus).erreur_systeme = d_es_processus; return; } @@ -504,13 +504,13 @@ retrait_thread_surveillance(struct_proce if (pthread_mutex_unlock(&((*s_argument_thread) .mutex_nombre_references)) != 0) { - pthread_mutex_unlock(&mutex_liste_threads); + pthread_mutex_unlock(&mutex_liste_threads_surveillance); (*s_etat_processus).erreur_systeme = d_es_processus; return; } } - if (pthread_mutex_unlock(&mutex_liste_threads) != 0) + if (pthread_mutex_unlock(&mutex_liste_threads_surveillance) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1380,6 +1380,18 @@ liberation_threads(struct_processus *s_e liste_threads = NULL; + if (pthread_mutex_unlock(&mutex_liste_threads) == -1) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + + if (pthread_mutex_lock(&mutex_liste_threads_surveillance) == -1) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + l_element_courant = liste_threads_surveillance; while(l_element_courant != NULL) @@ -1391,7 +1403,7 @@ liberation_threads(struct_processus *s_e != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; - pthread_mutex_unlock(&mutex_liste_threads); + pthread_mutex_unlock(&mutex_liste_threads_surveillance); return; } @@ -1414,7 +1426,7 @@ liberation_threads(struct_processus *s_e .mutex_nombre_references)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; - pthread_mutex_unlock(&mutex_liste_threads); + pthread_mutex_unlock(&mutex_liste_threads_surveillance); return; } @@ -1438,7 +1450,7 @@ liberation_threads(struct_processus *s_e .mutex_nombre_references)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; - pthread_mutex_unlock(&mutex_liste_threads); + pthread_mutex_unlock(&mutex_liste_threads_surveillance); return; } } @@ -1450,7 +1462,7 @@ liberation_threads(struct_processus *s_e liste_threads_surveillance = NULL; - if (pthread_mutex_unlock(&mutex_liste_threads) != 0) + if (pthread_mutex_unlock(&mutex_liste_threads_surveillance) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1558,6 +1570,8 @@ recherche_thread_principal(pid_t pid) static inline void verrouillage_gestionnaire_signaux(struct_processus *s_etat_processus) { + return; + # ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) # else @@ -1574,6 +1588,8 @@ verrouillage_gestionnaire_signaux(struct static inline void deverrouillage_gestionnaire_signaux(struct_processus *s_etat_processus) { + return; + # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) # else @@ -2574,6 +2590,11 @@ scrutation_interruptions(struct_processu // Il y a un signal en attente dans le segment partagé. On le // traite. + if (pthread_mutex_lock(&mutex_liste_threads) != 0) + { + return; + } + envoi_interruptions(s_etat_processus, (*s_queue_signaux).queue[(*s_queue_signaux) .pointeur_lecture].signal, (*s_queue_signaux).queue @@ -2592,6 +2613,11 @@ scrutation_interruptions(struct_processu } # endif + if (pthread_mutex_unlock(&mutex_liste_threads) != 0) + { + return; + } + while(sem_wait(semaphore_signalisation) != 0) { if (errno != EINTR) @@ -3529,9 +3555,23 @@ creation_queue_signaux(struct_processus sys_free(nom); - sem_init(&((*s_queue_signaux).semaphore), 1, 1); - sem_init(&((*s_queue_signaux).signalisation), 1, 0); - sem_init(&((*s_queue_signaux).arret_signalisation), 1, 1); + if (sem_init(&((*s_queue_signaux).semaphore), 1, 1) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + if (sem_init(&((*s_queue_signaux).signalisation), 1, 0) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + if (sem_init(&((*s_queue_signaux).arret_signalisation), 1, 1) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } (*s_queue_signaux).pointeur_lecture = 0; (*s_queue_signaux).pointeur_ecriture = 0;