--- rpl/src/interruptions.c 2014/07/15 14:12:38 1.147 +++ rpl/src/interruptions.c 2016/03/01 22:12:35 1.165 @@ -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. @@ -766,13 +766,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 +785,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 +1268,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; } @@ -2490,32 +2494,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; @@ -2543,7 +2559,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); @@ -2551,7 +2567,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); @@ -2561,7 +2577,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); @@ -2669,7 +2685,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); } @@ -2677,11 +2693,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) @@ -2694,11 +2710,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) @@ -2708,11 +2724,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)) == @@ -2929,14 +2945,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; } @@ -2948,17 +2964,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) @@ -2986,13 +3002,11 @@ creation_queue_signaux(struct_processus (*s_queue_signaux).requete_arret = d_faux; -# ifndef IPCS_SYSV if (msync(s_queue_signaux, sizeof(struct_queue_signaux), MS_SYNC)) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } -# endif # else // IPCS_SYSV # ifndef OS2 int segment; @@ -3024,7 +3038,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) @@ -3084,12 +3098,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); @@ -3153,6 +3167,7 @@ creation_queue_signaux(struct_processus return; } + (*s_queue_signaux).controle = getpid(); return; } @@ -3185,7 +3200,11 @@ liberation_queue_signaux(struct_processu // 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 @@ -3260,7 +3279,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) { @@ -3269,7 +3288,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) { @@ -3278,7 +3297,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) { @@ -3300,7 +3319,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)); @@ -3339,12 +3358,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;