--- rpl/src/interruptions.c 2013/05/28 22:09:55 1.133 +++ rpl/src/interruptions.c 2014/07/17 07:07:37 1.148 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.14 - Copyright (C) 1989-2013 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.18 + Copyright (C) 1989-2014 Dr. BERTRAND Joël This file is part of RPL/2. @@ -90,41 +90,23 @@ thread_surveillance_signaux(void *argume attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; -# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) - if (sem_wait(&(*s_queue_signaux).signalisation) == 0) -# else if (sem_wait(semaphore_signalisation) == 0) -# endif { -# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) - if (sem_wait(&(*s_queue_signaux).arret_signalisation) != 0) -# else if (sem_wait(semaphore_arret_signalisation) != 0) -# endif { (*s_etat_processus).erreur_systeme = d_es_processus; } if ((*s_queue_signaux).requete_arret == d_vrai) { -# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) - sem_post(&(*s_queue_signaux).arret_signalisation); - sem_post(&(*s_queue_signaux).signalisation); -# else sem_post(semaphore_arret_signalisation); sem_post(semaphore_signalisation); -# endif break; } -# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) - sem_post(&(*s_queue_signaux).arret_signalisation); - sem_post(&(*s_queue_signaux).signalisation); -# else sem_post(semaphore_arret_signalisation); sem_post(semaphore_signalisation); -# endif nombre_signaux_envoyes = 0; sched_yield(); @@ -133,11 +115,7 @@ thread_surveillance_signaux(void *argume // affectée au processus courant pour vérifier s'il y a quelque // chose à traiter. -# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) - sem_wait(&(*s_queue_signaux).semaphore); -# else sem_wait(semaphore_queue_signaux); -# endif if ((*s_queue_signaux).pointeur_lecture != (*s_queue_signaux).pointeur_ecriture) @@ -152,11 +130,7 @@ thread_surveillance_signaux(void *argume kill(getpid(), SIGALRM); } -# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) - sem_post(&(*s_queue_signaux).semaphore); -# else sem_post(semaphore_queue_signaux); -# endif // Dans un second temps, on balaye toutes les queues de signaux // des threads du processus courant. @@ -175,7 +149,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 +164,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; @@ -368,11 +342,7 @@ retrait_thread(struct_processus *s_etat_ (*l_element_courant).donnee)).s_etat_processus) .pointeur_signal_lecture) { -# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) - while(sem_wait(&((*s_queue_signaux).signalisation)) != 0) -# else while(sem_wait(semaphore_signalisation) != 0) -# endif { if (errno != EINTR) { @@ -1488,8 +1458,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,147 +1468,12 @@ 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 - if (sem_post(semaphore_gestionnaires_signaux) == -1) -# 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; - } - -# 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 +1487,6 @@ deverrouillage_gestionnaire_signaux(stru } } - /* - if (semaphore == 1) - { - if (pthread_mutex_unlock(&mutex_liste_threads) != 0) - { - BUG(1, uprintf("Unlock error !\n")); - return; - } - } - */ - return; } @@ -1775,8 +1597,13 @@ thread_signaux(void *argument) pthread_exit(NULL); } +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-result" + read(fds.fd, &signal, 1); +# pragma GCC diagnostic pop + if (signal != (0xFF & rpl_sigmax)) { envoi_signal_processus(getpid(), signal); @@ -1799,6 +1626,9 @@ interruption1(int signal) test_signal(signal); +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-result" + switch(signal) { case SIGINT: @@ -1821,6 +1651,8 @@ interruption1(int signal) break; } +# pragma GCC diagnostic pop + return; } @@ -1842,7 +1674,14 @@ interruption2(int signal) test_signal(signal); signal_tronque = (unsigned char) (rpl_sigtstp & 0xFF); + +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-result" + write(pipe_signaux, &signal_tronque, sizeof(signal_tronque)); + +# pragma GCC diagnostic pop + return; } @@ -1865,6 +1704,9 @@ interruption3(int signal) kill(pid_processus_pere, SIGUSR1); } +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-result" + if (signal != SIGUSR2) { write(STDERR_FILENO, message_1, strlen(message_1)); @@ -1874,6 +1716,8 @@ interruption3(int signal) write(STDERR_FILENO, message_2, strlen(message_2)); } +# pragma GCC diagnostic pop + _exit(EXIT_FAILURE); } @@ -1888,7 +1732,14 @@ interruption4(int signal) test_signal(signal); signal_tronque = (unsigned char) (rpl_sighup & 0xFF); + +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-result" + write(pipe_signaux, &signal_tronque, sizeof(signal_tronque)); + +# pragma GCC diagnostic pop + return; } @@ -1904,6 +1755,9 @@ interruption5(int signal) test_signal(signal); +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-result" + if (pid_processus_pere == getpid()) { signal_tronque = (unsigned char) (rpl_sigalrm & 0xFF); @@ -1911,6 +1765,9 @@ interruption5(int signal) } write(STDERR_FILENO, message, strlen(message)); + +# pragma GCC diagnostic pop + return; } @@ -2192,8 +2049,13 @@ interruption_violation_access(void *adre return(0); } +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-result" + write(STDERR_FILENO, message, strlen(message)); +# pragma GCC diagnostic pop + if (pid_processus_pere == getpid()) { longjmp(contexte_initial, -1); @@ -2453,6 +2315,9 @@ signal_hup(struct_processus *s_etat_proc (unsigned long long) getpid(), (unsigned long long) pthread_self()); +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-result" + if ((fichier = fopen(nom, "w+")) != NULL) { fclose(fichier); @@ -2463,6 +2328,8 @@ signal_hup(struct_processus *s_etat_proc freopen("/dev/null", "r", stdin); +# pragma GCC diagnostic pop + if (((*s_etat_processus).type_debug & d_debug_signaux) != 0) { printf("[%d] RPL/SIGHUP (thread %llu)\n", (int) getpid(), @@ -2583,11 +2450,7 @@ scrutation_interruptions(struct_processu // à lire. Les pointeurs d'écriture pointent sur les prochains éléments à // écrire. -# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) - if (sem_trywait(&((*s_queue_signaux).semaphore)) == 0) -# else - if (sem_trywait(semaphore_queue_signaux) == 0) -# endif + if (sem_trywait(semaphore_queue_signaux) == 0) { while((*s_queue_signaux).pointeur_lecture != (*s_queue_signaux).pointeur_ecriture) @@ -2603,11 +2466,16 @@ scrutation_interruptions(struct_processu ((*s_queue_signaux).pointeur_lecture + 1) % LONGUEUR_QUEUE_SIGNAUX; -# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) - while(sem_wait(&((*s_queue_signaux).signalisation)) != 0) -# else - while(sem_wait(semaphore_signalisation) != 0) +# ifndef IPCS_SYSV + if (msync(s_queue_signaux, sizeof(s_queue_signaux), + MS_ASYNC | MS_INVALIDATE) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } # endif + + while(sem_wait(semaphore_signalisation) != 0) { if (errno != EINTR) { @@ -2617,16 +2485,12 @@ scrutation_interruptions(struct_processu } } -# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) - sem_post(&((*s_queue_signaux).semaphore)); -# else - sem_post(semaphore_queue_signaux); -# endif + sem_post(semaphore_queue_signaux); } // 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) @@ -2641,11 +2505,7 @@ scrutation_interruptions(struct_processu ((*s_etat_processus).pointeur_signal_lecture + 1) % LONGUEUR_QUEUE_SIGNAUX; -# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) - while(sem_wait(&((*s_queue_signaux).signalisation)) != 0) -# else while(sem_wait(semaphore_signalisation) != 0) -# endif { if (errno != EINTR) { @@ -2655,12 +2515,13 @@ scrutation_interruptions(struct_processu } } - pthread_mutex_unlock(&((*s_etat_processus).mutex_interruptions)); + pthread_mutex_unlock(&((*s_etat_processus).mutex_signaux)); } return; } + /* ================================================================================ Fonction renvoyant le nom du segment de mémoire partagée en fonction @@ -2733,11 +2594,11 @@ envoi_signal_processus(pid_t pid, enum s # endif # ifndef IPCS_SYSV -# ifdef SEMAPHORES_NOMMES - sem_t *semaphore; - sem_t *signalisation; -# endif + sem_t *semaphore; + sem_t *signalisation; # else + sem_t *semaphore; + sem_t *signalisation; # ifndef OS2 int desc; key_t clef; @@ -2760,11 +2621,7 @@ envoi_signal_processus(pid_t pid, enum s return(1); } -# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) - while(sem_wait(&((*s_queue_signaux).semaphore)) != 0) -# else - while(sem_wait(semaphore_queue_signaux) != 0) -# endif + while(sem_wait(semaphore_queue_signaux) != 0) { if (errno != EINTR) { @@ -2781,20 +2638,20 @@ envoi_signal_processus(pid_t pid, enum s ((*s_queue_signaux).pointeur_ecriture + 1) % LONGUEUR_QUEUE_SIGNAUX; -# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) - if (sem_post(&((*s_queue_signaux).semaphore)) != 0) -# else - if (sem_post(semaphore_queue_signaux) != 0) +# ifndef IPCS_SYSV + if (msync(s_queue_signaux, sizeof(s_queue_signaux), + MS_ASYNC | MS_INVALIDATE) != 0) + { + return(1); + } # endif + + if (sem_post(semaphore_queue_signaux) != 0) { return(1); } -# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) - if (sem_post(&((*s_queue_signaux).signalisation)) != 0) -# else - if (sem_post(semaphore_signalisation) != 0) -# endif + if (sem_post(semaphore_signalisation) != 0) { return(1); } @@ -2866,49 +2723,29 @@ envoi_signal_processus(pid_t pid, enum s } # endif - // À ce moment, le segment de mémoire partagée est projeté - // dans l'espace du processus. + // À ce moment, le segment de mémoire partagée est projeté + // dans l'espace du processus. -# ifndef IPCS_SYSV // POSIX -# ifndef SEMAPHORES_NOMMES - while(sem_wait(&((*queue).semaphore)) != 0) - { - if (errno != EINTR) - { - return(1); - } - } -# else - if ((semaphore = sem_open2(pid, SEM_QUEUE)) == SEM_FAILED) - { - return(1); - } + if ((semaphore = sem_open2(pid, SEM_QUEUE)) == SEM_FAILED) + { + return(1); + } - if ((signalisation = sem_open2(pid, SEM_SIGNALISATION)) - == SEM_FAILED) - { - return(1); - } + if ((signalisation = sem_open2(pid, SEM_SIGNALISATION)) + == SEM_FAILED) + { + return(1); + } - while(sem_wait(semaphore) != 0) - { - if (errno != EINTR) - { - sem_close(semaphore); - sem_close(signalisation); - return(1); - } - } -# endif -# else // IPCS_SYSV - while(sem_wait(&((*queue).semaphore)) != 0) + while(sem_wait(semaphore) != 0) + { + if (errno != EINTR) { - if (errno != EINTR) - { - return(1); - } + sem_close(semaphore); + sem_close(signalisation); + return(1); } -# endif + } (*queue).queue[(*queue).pointeur_ecriture].pid = getpid(); (*queue).queue[(*queue).pointeur_ecriture].signal = signal; @@ -2916,59 +2753,45 @@ envoi_signal_processus(pid_t pid, enum s (*queue).pointeur_ecriture = ((*queue).pointeur_ecriture + 1) % LONGUEUR_QUEUE_SIGNAUX; -# ifndef IPCS_SYSV // POSIX -# ifndef SEMAPHORES_NOMMES - if (sem_post(&((*queue).semaphore)) != 0) - { - return(1); - } - - if (sem_post(&((*queue).signalisation)) != 0) - { - return(1); - } -# else - if (sem_post(semaphore) != 0) - { - sem_close(semaphore); - sem_close(signalisation); - return(1); - } +# ifndef IPCS_SYSV + if (msync(queue, sizeof(queue), MS_ASYNC | MS_INVALIDATE) != 0) + { + sem_close(semaphore); + sem_close(signalisation); + return(1); + } +# endif - if (sem_close(semaphore) != 0) - { - return(1); - } + if (sem_post(semaphore) != 0) + { + sem_close(semaphore); + sem_close(signalisation); + return(1); + } - if (sem_post(signalisation) != 0) - { - sem_close(signalisation); - return(1); - } + if (sem_close(semaphore) != 0) + { + return(1); + } - if (sem_close(signalisation) != 0) - { - return(1); - } + if (sem_post(signalisation) != 0) + { + sem_close(signalisation); + return(1); + } -# endif + if (sem_close(signalisation) != 0) + { + return(1); + } +# ifndef IPCS_SYSV // POSIX if (munmap(queue, sizeof(struct_queue_signaux)) != 0) { close(segment); return(1); } # else // IPCS_SYSV - if (sem_post(&((*queue).semaphore)) != 0) - { - return(1); - } - - if (sem_post(&((*queue).signalisation)) != 0) - { - return(1); - } - # ifndef OS2 // SysV if (shmdt(queue) != 0) { @@ -3020,7 +2843,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 +2855,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); @@ -3043,17 +2866,10 @@ envoi_signal_thread(pthread_t tid, enum return(1); } -# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) - if (sem_post(&((*s_queue_signaux).signalisation)) != 0) - { - return(1); - } -# else if (sem_post(semaphore_signalisation) != 0) { return(1); } -# endif return(0); } @@ -3062,26 +2878,19 @@ 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) - { - return(1); - } -# else if (sem_post(semaphore_signalisation) != 0) { return(1); } -# endif return(0); } @@ -3151,39 +2960,33 @@ creation_queue_signaux(struct_processus free(nom); -# ifndef SEMAPHORES_NOMMES - 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); -# else - if ((semaphore_queue_signaux = sem_init2(1, getpid(), SEM_QUEUE)) - == SEM_FAILED) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } + if ((semaphore_queue_signaux = sem_init2(1, getpid(), SEM_QUEUE)) + == SEM_FAILED) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } - if ((semaphore_signalisation = sem_init2(0, getpid(), - SEM_SIGNALISATION)) == SEM_FAILED) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } + if ((semaphore_signalisation = sem_init2(0, getpid(), + SEM_SIGNALISATION)) == SEM_FAILED) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } - if ((semaphore_arret_signalisation = sem_init2(1, getpid(), - SEM_ARRET_SIGNALISATION)) == SEM_FAILED) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } -# endif + if ((semaphore_arret_signalisation = sem_init2(1, getpid(), + SEM_ARRET_SIGNALISATION)) == SEM_FAILED) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } (*s_queue_signaux).pointeur_lecture = 0; (*s_queue_signaux).pointeur_ecriture = 0; (*s_queue_signaux).requete_arret = d_faux; - if (msync(s_queue_signaux, sizeof(struct_queue_signaux), 0)) + if (msync(s_queue_signaux, sizeof(struct_queue_signaux), MS_SYNC)) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -3244,9 +3047,26 @@ creation_queue_signaux(struct_processus return; } - 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 ((semaphore_queue_signaux = sem_init2(1, getpid(), SEM_QUEUE)) + == SEM_FAILED) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + + if ((semaphore_signalisation = sem_init2(0, getpid(), + SEM_SIGNALISATION)) == SEM_FAILED) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + + if ((semaphore_arret_signalisation = sem_init2(1, getpid(), + SEM_ARRET_SIGNALISATION)) == SEM_FAILED) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } (*s_queue_signaux).pointeur_lecture = 0; (*s_queue_signaux).pointeur_ecriture = 0; @@ -3351,28 +3171,18 @@ creation_queue_signaux(struct_processus void liberation_queue_signaux(struct_processus *s_etat_processus) { -# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) - sem_wait(&((*s_queue_signaux).arret_signalisation)); -# else sem_wait(semaphore_arret_signalisation); -# endif - (*s_queue_signaux).requete_arret = d_vrai; -# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) - sem_post(&((*s_queue_signaux).arret_signalisation)); -# else - sem_post(semaphore_arret_signalisation); +# ifndef IPCS_SYSV + msync(s_queue_signaux, sizeof(s_queue_signaux), MS_ASYNC | MS_INVALIDATE); # endif + sem_post(semaphore_arret_signalisation); + // 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 @@ -3385,13 +3195,9 @@ liberation_queue_signaux(struct_processu # else // OS/2 # endif # else // POSIX -# ifndef SEMAPHORES_NOMMES - // Rien à faire, les sémaphores sont anonymes. -# else - sem_close(semaphore_queue_signaux); - sem_close(semaphore_signalisation); - sem_close(semaphore_arret_signalisation); -# endif + sem_close(semaphore_queue_signaux); + sem_close(semaphore_signalisation); + sem_close(semaphore_arret_signalisation); if (munmap(s_queue_signaux, sizeof(struct_queue_signaux)) != 0) { @@ -3426,61 +3232,51 @@ destruction_queue_signaux(struct_process unsigned char *nom; # endif -# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) - sem_wait(&((*s_queue_signaux).arret_signalisation)); -# else sem_wait(semaphore_arret_signalisation); -# endif (*s_queue_signaux).requete_arret = d_vrai; -# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) - sem_post(&((*s_queue_signaux).arret_signalisation)); -# else - sem_post(semaphore_arret_signalisation); +# ifndef IPCS_SYSV + msync(s_queue_signaux, sizeof(s_queue_signaux), MS_ASYNC | MS_INVALIDATE); # endif + sem_post(semaphore_arret_signalisation); + // 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 # ifndef OS2 // Il faut commencer par éliminer le sémaphore. - if (semctl((*s_queue_signaux).semaphore.sem, 0, IPC_RMID) == -1) + if (semctl((*semaphore_queue_signaux).sem, 0, IPC_RMID) == -1) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } - unlink((*s_queue_signaux).semaphore.path); - free((*s_queue_signaux).semaphore.path); + unlink((*semaphore_queue_signaux).path); + free((*semaphore_queue_signaux).path); - if (semctl((*s_queue_signaux).signalisation.sem, 0, IPC_RMID) == -1) + if (semctl((*semaphore_signalisation).sem, 0, IPC_RMID) == -1) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } - unlink((*s_queue_signaux).signalisation.path); - free((*s_queue_signaux).signalisation.path); + unlink((*semaphore_signalisation).path); + free((*semaphore_signalisation).path); - if (semctl((*s_queue_signaux).arret_signalisation.sem, 0, IPC_RMID) - == -1) + if (semctl((*semaphore_arret_signalisation).sem, 0, IPC_RMID) == -1) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } - unlink((*s_queue_signaux).arret_signalisation.path); - free((*s_queue_signaux).arret_signalisation.path); + unlink((*semaphore_arret_signalisation).path); + free((*semaphore_arret_signalisation).path); if (shmdt(s_queue_signaux) == -1) { @@ -3520,21 +3316,10 @@ destruction_queue_signaux(struct_process } # endif # else // POSIX -# ifndef SEMAPHORES_NOMMES - sem_destroy(&((*s_queue_signaux).semaphore)); - sem_destroy(&((*s_queue_signaux).signalisation)); - sem_destroy(&((*s_queue_signaux).arret_signalisation)); -# else - sem_close(semaphore_queue_signaux); - sem_destroy2(semaphore_queue_signaux, getpid(), SEM_QUEUE); - - sem_close(semaphore_signalisation); - sem_destroy2(semaphore_signalisation, getpid(), SEM_SIGNALISATION); - - sem_close(semaphore_arret_signalisation); - sem_destroy2(semaphore_arret_signalisation, getpid(), - SEM_ARRET_SIGNALISATION); -# endif + sem_destroy2(semaphore_queue_signaux, getpid(), SEM_QUEUE); + sem_destroy2(semaphore_signalisation, getpid(), SEM_SIGNALISATION); + sem_destroy2(semaphore_arret_signalisation, getpid(), + SEM_ARRET_SIGNALISATION); if (munmap(s_queue_signaux, sizeof(struct_queue_signaux)) != 0) {