--- rpl/src/interruptions.c 2014/05/17 15:35:51 1.143 +++ rpl/src/interruptions.c 2016/03/09 17:49:12 1.166 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.18 - Copyright (C) 1989-2014 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.25 + Copyright (C) 1989-2016 Dr. BERTRAND Joël This file is part of RPL/2. @@ -109,7 +109,6 @@ thread_surveillance_signaux(void *argume sem_post(semaphore_signalisation); nombre_signaux_envoyes = 0; - sched_yield(); // Dans un premier temps, on verrouille la queue des signaux // affectée au processus courant pour vérifier s'il y a quelque @@ -128,6 +127,7 @@ thread_surveillance_signaux(void *argume nombre_signaux_envoyes++; kill(getpid(), SIGALRM); + sched_yield(); } sem_post(semaphore_queue_signaux); @@ -160,6 +160,7 @@ thread_surveillance_signaux(void *argume nombre_signaux_envoyes++; pthread_kill((*((struct_thread *) (*l_element_courant).donnee)).tid, SIGALRM); + sched_yield(); } pthread_mutex_unlock(&((*(*((struct_thread *) @@ -766,13 +767,14 @@ liberation_threads(struct_processus *s_e } } - // ne peut être effacé qu'une seule fois + // Ne peut être effacé qu'une seule fois if (suppression_variables_partagees == d_faux) { suppression_variables_partagees = d_vrai; liberation_arbre_variables_partagees(s_etat_processus, (*(*s_etat_processus).s_arbre_variables_partagees)); + (*(*s_etat_processus).s_arbre_variables_partagees) = NULL; l_element_partage_courant = (*(*s_etat_processus) .l_liste_variables_partagees); @@ -784,6 +786,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, @@ -1265,7 +1269,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; } @@ -1468,21 +1473,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; } @@ -1747,7 +1737,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; } @@ -2057,8 +2054,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); @@ -2469,12 +2471,14 @@ scrutation_interruptions(struct_processu ((*s_queue_signaux).pointeur_lecture + 1) % LONGUEUR_QUEUE_SIGNAUX; +# 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) { @@ -2491,32 +2495,44 @@ scrutation_interruptions(struct_processu // Interruptions qui arrivent depuis le groupe courant de threads. - if (pthread_mutex_trylock(&((*s_etat_processus).mutex_signaux)) == 0) + if (pthread_mutex_trylock(&mutex_liste_threads) == 0) { - while((*s_etat_processus).pointeur_signal_lecture != - (*s_etat_processus).pointeur_signal_ecriture) + if (pthread_mutex_trylock(&((*s_etat_processus).mutex_signaux)) == 0) { - // Il y a un signal dans la queue du thread courant. On le traite. + while((*s_etat_processus).pointeur_signal_lecture != + (*s_etat_processus).pointeur_signal_ecriture) + { + // Il y a un signal dans la queue du thread courant. + // On le traite. - envoi_interruptions(s_etat_processus, - (*s_etat_processus).signaux_en_queue - [(*s_etat_processus).pointeur_signal_lecture], - getpid()); - (*s_etat_processus).pointeur_signal_lecture = - ((*s_etat_processus).pointeur_signal_lecture + 1) - % LONGUEUR_QUEUE_SIGNAUX; + envoi_interruptions(s_etat_processus, + (*s_etat_processus).signaux_en_queue + [(*s_etat_processus).pointeur_signal_lecture], + getpid()); + (*s_etat_processus).pointeur_signal_lecture = + ((*s_etat_processus).pointeur_signal_lecture + 1) + % LONGUEUR_QUEUE_SIGNAUX; - while(sem_wait(semaphore_signalisation) != 0) - { - if (errno != EINTR) + while(sem_wait(semaphore_signalisation) != 0) { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; + if (errno != EINTR) + { + if (pthread_mutex_unlock(&mutex_liste_threads) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } } } + + pthread_mutex_unlock(&((*s_etat_processus).mutex_signaux)); } - pthread_mutex_unlock(&((*s_etat_processus).mutex_signaux)); + pthread_mutex_unlock(&mutex_liste_threads); } return; @@ -2544,7 +2560,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); @@ -2552,7 +2568,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); @@ -2562,7 +2578,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); @@ -2639,11 +2655,14 @@ envoi_signal_processus(pid_t pid, enum s ((*s_queue_signaux).pointeur_ecriture + 1) % LONGUEUR_QUEUE_SIGNAUX; +# ifndef IPCS_SYSV if (msync(s_queue_signaux, sizeof(s_queue_signaux), MS_ASYNC | MS_INVALIDATE) != 0) { + sem_post(semaphore_queue_signaux); return(1); } +# endif if (sem_post(semaphore_queue_signaux) != 0) { @@ -2668,7 +2687,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); } @@ -2676,11 +2695,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) @@ -2693,11 +2712,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) @@ -2707,11 +2726,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)) == @@ -2752,12 +2771,14 @@ envoi_signal_processus(pid_t pid, enum s (*queue).pointeur_ecriture = ((*queue).pointeur_ecriture + 1) % LONGUEUR_QUEUE_SIGNAUX; +# ifndef IPCS_SYSV if (msync(queue, sizeof(queue), MS_ASYNC | MS_INVALIDATE) != 0) { sem_close(semaphore); sem_close(signalisation); return(1); } +# endif if (sem_post(semaphore) != 0) { @@ -2926,14 +2947,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; } @@ -2945,17 +2966,17 @@ 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); if ((semaphore_queue_signaux = sem_init2(1, getpid(), SEM_QUEUE)) == SEM_FAILED) @@ -2983,7 +3004,8 @@ creation_queue_signaux(struct_processus (*s_queue_signaux).requete_arret = d_faux; - if (msync(s_queue_signaux, sizeof(struct_queue_signaux), MS_SYNC)) + if (msync(s_queue_signaux, sizeof(struct_queue_signaux), + MS_ASYNC | MS_INVALIDATE) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -3019,7 +3041,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) @@ -3079,12 +3101,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); @@ -3148,6 +3170,17 @@ creation_queue_signaux(struct_processus return; } + (*s_queue_signaux).controle = getpid(); + +# 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 + return; } @@ -3169,17 +3202,22 @@ void liberation_queue_signaux(struct_processus *s_etat_processus) { sem_wait(semaphore_arret_signalisation); - (*s_queue_signaux).requete_arret = d_vrai; +# 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. sem_post(semaphore_signalisation); - 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 @@ -3231,13 +3269,16 @@ destruction_queue_signaux(struct_process sem_wait(semaphore_arret_signalisation); (*s_queue_signaux).requete_arret = d_vrai; + +# 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. sem_post(semaphore_signalisation); - pthread_join((*s_queue_signaux).thread_signaux, NULL); # ifdef IPCS_SYSV // SystemV @@ -3251,7 +3292,7 @@ destruction_queue_signaux(struct_process } unlink((*semaphore_queue_signaux).path); - free((*semaphore_queue_signaux).path); + sys_free((*semaphore_queue_signaux).path); if (semctl((*semaphore_signalisation).sem, 0, IPC_RMID) == -1) { @@ -3260,7 +3301,7 @@ destruction_queue_signaux(struct_process } unlink((*semaphore_signalisation).path); - free((*semaphore_signalisation).path); + sys_free((*semaphore_signalisation).path); if (semctl((*semaphore_arret_signalisation).sem, 0, IPC_RMID) == -1) { @@ -3269,7 +3310,7 @@ destruction_queue_signaux(struct_process } unlink((*semaphore_arret_signalisation).path); - free((*semaphore_arret_signalisation).path); + sys_free((*semaphore_arret_signalisation).path); if (shmdt(s_queue_signaux) == -1) { @@ -3291,7 +3332,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)); @@ -3309,13 +3350,8 @@ destruction_queue_signaux(struct_process } # endif # else // POSIX - 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); @@ -3335,12 +3371,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;