--- rpl/src/interruptions.c 2013/05/28 22:09:55 1.133 +++ rpl/src/interruptions.c 2013/05/30 09:41:41 1.134 @@ -175,7 +175,7 @@ thread_surveillance_signaux(void *argume { pthread_mutex_lock(&((*(*((struct_thread *) (*l_element_courant).donnee)).s_etat_processus) - .mutex_interruptions)); + .mutex_signaux)); if ((*(*((struct_thread *) (*l_element_courant).donnee)) .s_etat_processus).pointeur_signal_ecriture != @@ -190,7 +190,7 @@ thread_surveillance_signaux(void *argume pthread_mutex_unlock(&((*(*((struct_thread *) (*l_element_courant).donnee)).s_etat_processus) - .mutex_interruptions)); + .mutex_signaux)); } l_element_courant = (*l_element_courant).suivant; @@ -1488,8 +1488,6 @@ recherche_thread_principal(pid_t pid) static inline void verrouillage_gestionnaire_signaux(struct_processus *s_etat_processus) { - int semaphore; - # ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) # else @@ -1500,19 +1498,6 @@ verrouillage_gestionnaire_signaux(struct return; } - // Il faut respecteur l'atomicité des deux opérations suivantes ! - - if (pthread_mutex_lock(&mutex_gestionnaires_signaux_atomique) != 0) - { -# ifndef SEMAPHORES_NOMMES - sem_wait(&((*s_etat_processus).semaphore_fork)); -# else - sem_wait((*s_etat_processus).semaphore_fork); -# endif - BUG(1, uprintf("Unlock error !\n")); - return; - } - # ifndef SEMAPHORES_NOMMES if (sem_post(&semaphore_gestionnaires_signaux) == -1) # else @@ -1528,119 +1513,12 @@ verrouillage_gestionnaire_signaux(struct return; } -# ifndef SEMAPHORES_NOMMES - if (sem_getvalue(&semaphore_gestionnaires_signaux, &semaphore) != 0) -# else - if (sem_getvalue(semaphore_gestionnaires_signaux, &semaphore) != 0) -# endif - { -# ifndef SEMAPHORES_NOMMES - sem_wait(&((*s_etat_processus).semaphore_fork)); -# else - sem_wait((*s_etat_processus).semaphore_fork); -# endif - BUG(1, uprintf("Lock error !\n")); - return; - } - - if (pthread_mutex_unlock(&mutex_gestionnaires_signaux_atomique) != 0) - { -# ifndef SEMAPHORES_NOMMES - sem_wait(&((*s_etat_processus).semaphore_fork)); -# else - sem_wait((*s_etat_processus).semaphore_fork); -# endif - BUG(1, uprintf("Unlock error !\n")); - return; - } - -/* - if (semaphore == 1) - { - // Le semaphore ne peut être pris par le thread qui a appelé - // le gestionnaire de signal car le signal est bloqué par ce thread - // dans les zones critiques. Ce sémaphore ne peut donc être bloqué que - // par un thread concurrent. On essaye donc de le bloquer jusqu'à - // ce que ce soit possible. - - if (pthread_mutex_lock(&mutex_liste_threads) != 0) - { -# ifndef SEMAPHORES_NOMMES - sem_wait(&((*s_etat_processus).semaphore_fork)); -# else - sem_wait((*s_etat_processus).semaphore_fork); -# endif - BUG(1, uprintf("Lock error !\n")); - return; - } - } - */ - return; } static inline void deverrouillage_gestionnaire_signaux(struct_processus *s_etat_processus) { - int semaphore; - - // Il faut respecteur l'atomicité des deux opérations suivantes ! - - if (pthread_mutex_lock(&mutex_gestionnaires_signaux_atomique) == -1) - { -# ifndef SEMAPHORES_NOMMES - sem_wait(&((*s_etat_processus).semaphore_fork)); -# else - sem_wait((*s_etat_processus).semaphore_fork); -# endif - BUG(1, uprintf("Unlock error !\n")); - return; - } - -# ifndef SEMAPHORES_NOMMES - if (sem_getvalue(&semaphore_gestionnaires_signaux, &semaphore) != 0) -# else - if (sem_getvalue(semaphore_gestionnaires_signaux, &semaphore) != 0) -# endif - { -# ifndef SEMAPHORES_NOMMES - sem_wait(&((*s_etat_processus).semaphore_fork)); -# else - sem_wait((*s_etat_processus).semaphore_fork); -# endif - BUG(1, uprintf("Unlock error !\n")); - return; - } - -# ifndef SEMAPHORES_NOMMES - while(sem_wait(&semaphore_gestionnaires_signaux) == -1) -# else - while(sem_wait(semaphore_gestionnaires_signaux) == -1) -# endif - { - if (errno != EINTR) - { -# ifndef SEMAPHORES_NOMMES - sem_wait(&((*s_etat_processus).semaphore_fork)); -# else - sem_wait((*s_etat_processus).semaphore_fork); -# endif - BUG(1, uprintf("Unlock error !\n")); - return; - } - } - - if (pthread_mutex_unlock(&mutex_gestionnaires_signaux_atomique) != 0) - { -# ifndef SEMAPHORES_NOMMES - sem_wait(&((*s_etat_processus).semaphore_fork)); -# else - sem_wait((*s_etat_processus).semaphore_fork); -# endif - BUG(1, uprintf("Unlock error !\n")); - return; - } - # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) # else @@ -1654,17 +1532,6 @@ deverrouillage_gestionnaire_signaux(stru } } - /* - if (semaphore == 1) - { - if (pthread_mutex_unlock(&mutex_liste_threads) != 0) - { - BUG(1, uprintf("Unlock error !\n")); - return; - } - } - */ - return; } @@ -2626,7 +2493,7 @@ scrutation_interruptions(struct_processu // Interruptions qui arrivent depuis le groupe courant de threads. - if (pthread_mutex_trylock(&((*s_etat_processus).mutex_interruptions)) == 0) + if (pthread_mutex_trylock(&((*s_etat_processus).mutex_signaux)) == 0) { while((*s_etat_processus).pointeur_signal_lecture != (*s_etat_processus).pointeur_signal_ecriture) @@ -2655,7 +2522,7 @@ scrutation_interruptions(struct_processu } } - pthread_mutex_unlock(&((*s_etat_processus).mutex_interruptions)); + pthread_mutex_unlock(&((*s_etat_processus).mutex_signaux)); } return; @@ -3020,7 +2887,7 @@ envoi_signal_thread(pthread_t tid, enum s_etat_processus = (*((struct_thread *) (*l_element_courant).donnee)) .s_etat_processus; - if (pthread_mutex_lock(&((*s_etat_processus).mutex_interruptions)) != 0) + if (pthread_mutex_lock(&((*s_etat_processus).mutex_signaux)) != 0) { pthread_mutex_unlock(&mutex_liste_threads); return(1); @@ -3032,7 +2899,7 @@ envoi_signal_thread(pthread_t tid, enum ((*s_etat_processus).pointeur_signal_ecriture + 1) % LONGUEUR_QUEUE_SIGNAUX; - if (pthread_mutex_unlock(&((*s_etat_processus).mutex_interruptions)) != 0) + if (pthread_mutex_unlock(&((*s_etat_processus).mutex_signaux)) != 0) { pthread_mutex_unlock(&mutex_liste_threads); return(1); @@ -3062,14 +2929,14 @@ int envoi_signal_contexte(struct_processus *s_etat_processus_a_signaler, enum signaux_rpl signal) { - pthread_mutex_lock(&((*s_etat_processus_a_signaler).mutex_interruptions)); + pthread_mutex_lock(&((*s_etat_processus_a_signaler).mutex_signaux)); (*s_etat_processus_a_signaler).signaux_en_queue [(*s_etat_processus_a_signaler).pointeur_signal_ecriture] = signal; (*s_etat_processus_a_signaler).pointeur_signal_ecriture = ((*s_etat_processus_a_signaler).pointeur_signal_ecriture + 1) % LONGUEUR_QUEUE_SIGNAUX; - pthread_mutex_unlock(&((*s_etat_processus_a_signaler).mutex_interruptions)); + pthread_mutex_unlock(&((*s_etat_processus_a_signaler).mutex_signaux)); # if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) if (sem_post(&((*s_queue_signaux).signalisation)) != 0)