--- rpl/src/interruptions.c 2015/01/05 13:12:41 1.150 +++ rpl/src/interruptions.c 2015/07/21 20:16:19 1.160 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.19 + RPL/2 (R) version 4.1.22 Copyright (C) 1989-2015 Dr. BERTRAND Joël This file is part of RPL/2. @@ -784,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, @@ -1265,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; } @@ -2543,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); @@ -2551,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); @@ -2561,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); @@ -2669,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); } @@ -2677,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) @@ -2694,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) @@ -2708,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)) == @@ -2929,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; } @@ -2948,17 +2951,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) @@ -3022,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) @@ -3082,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); @@ -3151,6 +3154,7 @@ creation_queue_signaux(struct_processus return; } + (*s_queue_signaux).controle = getpid(); return; } @@ -3183,7 +3187,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 @@ -3258,7 +3266,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) { @@ -3267,7 +3275,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) { @@ -3276,7 +3284,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) { @@ -3298,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)); @@ -3337,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;