--- rpl/src/interruptions.c 2013/08/27 13:48:52 1.136 +++ rpl/src/interruptions.c 2015/07/21 20:16:19 1.160 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.15 - Copyright (C) 1989-2013 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.22 + Copyright (C) 1989-2015 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. @@ -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) { @@ -814,6 +784,8 @@ liberation_threads(struct_processus *s_e free(l_element_partage_courant); l_element_partage_courant = l_element_partage_suivant; } + + (*(*s_etat_processus).l_liste_variables_partagees) = NULL; } liberation_arbre_variables(s_etat_processus, @@ -1295,7 +1267,8 @@ liberation_threads(struct_processus *s_e # endif liberation_contexte_cas(s_etat_processus); - free(s_etat_processus); + liberation_allocateur_buffer(s_etat_processus); + sys_free(s_etat_processus); s_etat_processus = candidat; } @@ -1498,21 +1471,6 @@ verrouillage_gestionnaire_signaux(struct 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; - } - return; } @@ -1642,8 +1600,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); @@ -1666,6 +1629,9 @@ interruption1(int signal) test_signal(signal); +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-result" + switch(signal) { case SIGINT: @@ -1688,6 +1654,8 @@ interruption1(int signal) break; } +# pragma GCC diagnostic pop + return; } @@ -1709,7 +1677,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; } @@ -1732,6 +1707,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)); @@ -1741,6 +1719,8 @@ interruption3(int signal) write(STDERR_FILENO, message_2, strlen(message_2)); } +# pragma GCC diagnostic pop + _exit(EXIT_FAILURE); } @@ -1755,7 +1735,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; } @@ -1771,6 +1758,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); @@ -1778,6 +1768,9 @@ interruption5(int signal) } write(STDERR_FILENO, message, strlen(message)); + +# pragma GCC diagnostic pop + return; } @@ -2059,8 +2052,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); @@ -2320,6 +2318,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); @@ -2330,6 +2331,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(), @@ -2450,11 +2453,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) @@ -2470,11 +2469,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) { @@ -2484,11 +2488,7 @@ 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. @@ -2508,11 +2508,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) { @@ -2528,6 +2524,7 @@ scrutation_interruptions(struct_processu return; } + /* ================================================================================ Fonction renvoyant le nom du segment de mémoire partagée en fonction @@ -2549,7 +2546,7 @@ nom_segment(unsigned char *chemin, pid_t # ifdef IPCS_SYSV // !POSIX # ifndef OS2 // !OS2 - if ((fichier = malloc((strlen(chemin) + 1 + 256 + 1) * + if ((fichier = sys_malloc((strlen(chemin) + 1 + 256 + 1) * sizeof(unsigned char))) == NULL) { return(NULL); @@ -2557,7 +2554,7 @@ nom_segment(unsigned char *chemin, pid_t sprintf(fichier, "%s/RPL-SIGQUEUES-%d", chemin, (int) pid); # else // OS2 - if ((fichier = malloc((10 + 256 + 1) * sizeof(unsigned char))) + if ((fichier = sys_malloc((10 + 256 + 1) * sizeof(unsigned char))) == NULL) { return(NULL); @@ -2567,7 +2564,7 @@ nom_segment(unsigned char *chemin, pid_t # endif // OS2 # else // POSIX - if ((fichier = malloc((1 + 256 + 1) * + if ((fichier = sys_malloc((1 + 256 + 1) * sizeof(unsigned char))) == NULL) { return(NULL); @@ -2600,11 +2597,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; @@ -2627,11 +2624,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) { @@ -2648,20 +2641,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); } @@ -2679,7 +2672,7 @@ envoi_signal_processus(pid_t pid, enum s # ifndef OS2 // SysV if ((desc = open(nom, O_RDWR)) == -1) { - free(nom); + sys_free(nom); return(1); } @@ -2687,11 +2680,11 @@ envoi_signal_processus(pid_t pid, enum s if ((clef = ftok(nom, 1)) == -1) { - free(nom); + sys_free(nom); return(1); } - free(nom); + sys_free(nom); if ((segment = shmget(clef, sizeof(struct_queue_signaux), 0)) == -1) @@ -2704,11 +2697,11 @@ envoi_signal_processus(pid_t pid, enum s if (DosGetNamedSharedMem((PVOID) &queue, nom, PAG_WRITE | PAG_READ) != 0) { - free(nom); + sys_free(nom); return(1); } - free(nom); + sys_free(nom); # endif # else // POSIX if ((nom = nom_segment(racine_segment, pid)) == NULL) @@ -2718,11 +2711,11 @@ envoi_signal_processus(pid_t pid, enum s if ((segment = shm_open(nom, O_RDWR, 0)) == -1) { - free(nom); + sys_free(nom); return(1); } - free(nom); + sys_free(nom); if ((queue = mmap(NULL, sizeof(struct_queue_signaux), PROT_READ | PROT_WRITE, MAP_SHARED, segment, 0)) == @@ -2733,49 +2726,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; @@ -2783,59 +2756,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) { @@ -2910,17 +2869,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); } @@ -2938,17 +2890,10 @@ envoi_signal_contexte(struct_processus * % LONGUEUR_QUEUE_SIGNAUX; 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); } @@ -2987,14 +2932,14 @@ creation_queue_signaux(struct_processus if ((f_queue_signaux = shm_open(nom, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR)) == -1) { - free(nom); + sys_free(nom); (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (ftruncate(f_queue_signaux, sizeof(struct_queue_signaux)) == -1) { - free(nom); + sys_free(nom); (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } @@ -3006,51 +2951,45 @@ creation_queue_signaux(struct_processus { if (shm_unlink(nom) == -1) { - free(nom); + sys_free(nom); (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } - free(nom); + sys_free(nom); (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } - free(nom); + sys_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; @@ -3086,7 +3025,7 @@ creation_queue_signaux(struct_processus } close(support); - free(nom); + sys_free(nom); if ((segment = shmget(clef, sizeof(struct_queue_signaux), IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR)) == -1) @@ -3111,9 +3050,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; @@ -3129,12 +3085,12 @@ creation_queue_signaux(struct_processus sizeof(struct_queue_signaux), PAG_WRITE | PAG_READ | PAG_COMMIT) != 0) { - free(nom); + sys_free(nom); (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } - free(nom); + sys_free(nom); sem_init(&((*s_queue_signaux).semaphore), 1, 1); sem_init(&((*s_queue_signaux).signalisation), 1, 0); @@ -3198,6 +3154,7 @@ creation_queue_signaux(struct_processus return; } + (*s_queue_signaux).controle = getpid(); return; } @@ -3218,29 +3175,23 @@ 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); + if (getpid() == (*s_queue_signaux).controle) + { + pthread_join((*s_queue_signaux).thread_signaux, NULL); + } # ifdef IPCS_SYSV // SystemV # ifndef OS2 @@ -3252,13 +3203,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) { @@ -3293,61 +3240,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); + sys_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); + sys_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); + sys_free((*semaphore_arret_signalisation).path); if (shmdt(s_queue_signaux) == -1) { @@ -3369,7 +3306,7 @@ destruction_queue_signaux(struct_process } unlink(nom); - free(nom); + sys_free(nom); # else sem_close(&((*s_queue_signaux).semaphore)); sem_destroy(&((*s_queue_signaux).semaphore)); @@ -3387,21 +3324,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) { @@ -3419,12 +3345,12 @@ destruction_queue_signaux(struct_process if (shm_unlink(nom) != 0) { - free(nom); + sys_free(nom); (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } - free(nom); + sys_free(nom); # endif return;