--- rpl/src/interruptions.c 2012/12/19 09:58:27 1.113 +++ rpl/src/interruptions.c 2013/05/22 13:40:12 1.129 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.12 - Copyright (C) 1989-2012 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.14 + Copyright (C) 1989-2013 Dr. BERTRAND Joël This file is part of RPL/2. @@ -81,6 +81,11 @@ thread_surveillance_signaux(void *argume volatile struct_liste_chainee_volatile *l_element_courant; + sigset_t set; + + sigfillset(&set); + pthread_sigmask(SIG_BLOCK, &set, NULL); + s_etat_processus = (struct_processus *) argument; for(;;) @@ -96,6 +101,12 @@ thread_surveillance_signaux(void *argume { if ((*s_queue_signaux).requete_arret == d_vrai) { +# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) + sem_post(&(*s_queue_signaux).signalisation); +# else + sem_post(semaphore_signalisation); +# endif + break; } @@ -140,7 +151,12 @@ thread_surveillance_signaux(void *argume // Dans un second temps, on balaye toutes les queues de signaux // des threads du processus courant. + // Attention : l'ordre de verrouillage des mutexes est important + // pour éviter les conditions bloquantes ! + + pthread_mutex_lock(&mutex_interruptions); pthread_mutex_lock(&mutex_liste_threads); + l_element_courant = liste_threads; while(l_element_courant != NULL) @@ -150,12 +166,13 @@ thread_surveillance_signaux(void *argume { if ((*(*((struct_thread *) (*l_element_courant).donnee)) .s_etat_processus).pointeur_signal_ecriture != - (*(*((struct_thread *) (*l_element_courant).donnee)) - .s_etat_processus).pointeur_signal_lecture) + (*(*((struct_thread *) (*l_element_courant) + .donnee)).s_etat_processus) + .pointeur_signal_lecture) { nombre_signaux_envoyes++; - pthread_kill((*((struct_thread *) (*l_element_courant) - .donnee)).tid, SIGALRM); + pthread_kill((*((struct_thread *) + (*l_element_courant).donnee)).tid, SIGALRM); } } @@ -163,6 +180,7 @@ thread_surveillance_signaux(void *argume } pthread_mutex_unlock(&mutex_liste_threads); + pthread_mutex_unlock(&mutex_interruptions); // Nanosleep @@ -550,7 +568,7 @@ liberation_threads(struct_processus *s_e struct_liste_variables_statiques *l_element_statique_courant; struct_liste_variables_statiques *l_element_statique_suivant; - unsigned long i; + integer8 i; void *element_candidat; void *element_courant; @@ -593,8 +611,7 @@ liberation_threads(struct_processus *s_e close((*s_etat_processus).pipe_injections); close((*s_etat_processus).pipe_nombre_injections); close((*s_etat_processus).pipe_interruptions); - close((*s_etat_processus).pipe_nombre_objets_attente); - close((*s_etat_processus).pipe_nombre_interruptions_attente); + close((*s_etat_processus).pipe_nombre_elements_attente); liberation(s_etat_processus, (*s_etat_processus).at_exit); @@ -662,10 +679,8 @@ liberation_threads(struct_processus *s_e close((*s_argument_thread).pipe_acquittement[1]); close((*s_argument_thread).pipe_injections[1]); close((*s_argument_thread).pipe_nombre_injections[1]); - close((*s_argument_thread).pipe_nombre_objets_attente[0]); + close((*s_argument_thread).pipe_nombre_elements_attente[0]); close((*s_argument_thread).pipe_interruptions[0]); - close((*s_argument_thread) - .pipe_nombre_interruptions_attente[0]); if (pthread_mutex_unlock(&((*s_argument_thread) .mutex_nombre_references)) != 0) @@ -1306,9 +1321,8 @@ liberation_threads(struct_processus *s_e close((*s_argument_thread).pipe_acquittement[1]); close((*s_argument_thread).pipe_injections[1]); close((*s_argument_thread).pipe_nombre_injections[1]); - close((*s_argument_thread).pipe_nombre_objets_attente[0]); + close((*s_argument_thread).pipe_nombre_elements_attente[0]); close((*s_argument_thread).pipe_interruptions[0]); - close((*s_argument_thread).pipe_nombre_interruptions_attente[0]); if (pthread_mutex_unlock(&((*s_argument_thread) .mutex_nombre_references)) != 0) @@ -2404,8 +2418,9 @@ signal_hup(struct_processus *s_etat_proc return; } - snprintf(nom, 8 + 64 + 1, "rpl-out-%lu-%lu", (unsigned long) getpid(), - (unsigned long) pthread_self()); + snprintf(nom, 8 + 64 + 1, "rpl-out-%llu-%llu", + (unsigned long long) getpid(), + (unsigned long long) pthread_self()); if ((fichier = fopen(nom, "w+")) != NULL) { @@ -2971,15 +2986,15 @@ envoi_signal_thread(pthread_t tid, enum return(1); } + s_etat_processus = (*((struct_thread *) (*l_element_courant).donnee)) + .s_etat_processus; + if (pthread_mutex_lock(&mutex_interruptions) != 0) { pthread_mutex_unlock(&mutex_liste_threads); return(1); } - s_etat_processus = (*((struct_thread *) (*l_element_courant).donnee)) - .s_etat_processus; - (*s_etat_processus).signaux_en_queue [(*s_etat_processus).pointeur_signal_ecriture] = signal; (*s_etat_processus).pointeur_signal_ecriture = @@ -3315,8 +3330,7 @@ liberation_queue_signaux(struct_processu # endif # else // POSIX # ifndef SEMAPHORES_NOMMES - sem_close(&((*s_queue_signaux).semaphore)); - sem_close(&((*s_queue_signaux).signalisation)); + // Rien à faire, les sémaphores sont anonymes. # else sem_close(semaphore_queue_signaux); sem_close(semaphore_signalisation); @@ -3355,7 +3369,11 @@ destruction_queue_signaux(struct_process unsigned char *nom; # endif - // Incrémenter le sémaphore pour être sûr de le débloquer. +# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) + sem_wait(&((*s_queue_signaux).signalisation)); +# else + sem_wait(semaphore_signalisation); +# endif (*s_queue_signaux).requete_arret = d_vrai; @@ -3365,6 +3383,14 @@ destruction_queue_signaux(struct_process sem_post(semaphore_signalisation); # endif + // Incrémenter le sémaphore pour être sûr de le débloquer. + +# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) + sem_post(&((*s_queue_signaux).signalisation)); +# else + sem_post(semaphore_signalisation); +# endif + pthread_join((*s_queue_signaux).thread_signaux, NULL); # ifdef IPCS_SYSV // SystemV @@ -3425,10 +3451,7 @@ destruction_queue_signaux(struct_process # endif # else // POSIX # ifndef SEMAPHORES_NOMMES - sem_close(&((*s_queue_signaux).semaphore)); sem_destroy(&((*s_queue_signaux).semaphore)); - - sem_close(&((*s_queue_signaux).signalisation)); sem_destroy(&((*s_queue_signaux).signalisation)); # else sem_close(semaphore_queue_signaux);