--- rpl/src/interruptions.c 2016/03/24 09:38:29 1.175 +++ rpl/src/interruptions.c 2016/03/29 12:27:35 1.176 @@ -2480,6 +2480,7 @@ scrutation_interruptions(struct_processu if (msync(s_queue_signaux, sizeof(s_queue_signaux), MS_ASYNC | MS_INVALIDATE) != 0) { + sem_post(semaphore_queue_signaux); (*s_etat_processus).erreur_systeme = d_es_processus; return; } @@ -2818,12 +2819,14 @@ envoi_signal_processus(pid_t pid, enum s { munmap(queue, sizeof(struct_queue_signaux)); close(segment); + sem_close(semaphore); return(1); } if (munmap(queue, sizeof(struct_queue_signaux)) != 0) { close(segment); + sem_close(semaphore); return(1); } @@ -2832,6 +2835,7 @@ envoi_signal_processus(pid_t pid, enum s # ifndef OS2 // SysV if (shmdt(queue) != 0) { + sem_close(semaphore); return(1); } # else // OS/2 @@ -2852,12 +2856,16 @@ envoi_signal_processus(pid_t pid, enum s != 0) { munmap(queue, sizeof(struct_queue_signaux)); + sem_close(semaphore); + sem_close(signalisation); close(segment); return(1); } if (munmap(queue, sizeof(struct_queue_signaux)) != 0) { + sem_close(semaphore); + sem_close(signalisation); close(segment); return(1); } @@ -2867,6 +2875,8 @@ envoi_signal_processus(pid_t pid, enum s # ifndef OS2 // SysV if (shmdt(queue) != 0) { + sem_close(semaphore); + sem_close(signalisation); return(1); } # else // OS/2 @@ -2893,12 +2903,16 @@ envoi_signal_processus(pid_t pid, enum s { munmap(queue, sizeof(struct_queue_signaux)); close(segment); + sem_close(semaphore); + sem_close(signalisation); return(1); } if (munmap(queue, sizeof(struct_queue_signaux)) != 0) { close(segment); + sem_close(semaphore); + sem_close(signalisation); return(1); } @@ -2907,6 +2921,8 @@ envoi_signal_processus(pid_t pid, enum s # ifndef OS2 // SysV if (shmdt(queue) != 0) { + sem_close(semaphore); + sem_close(signalisation); return(1); } # else // OS/2 @@ -2926,12 +2942,14 @@ envoi_signal_processus(pid_t pid, enum s { munmap(queue, sizeof(struct_queue_signaux)); close(segment); + sem_close(signalisation); return(1); } if (munmap(queue, sizeof(struct_queue_signaux)) != 0) { close(segment); + sem_close(signalisation); return(1); } @@ -2940,6 +2958,7 @@ envoi_signal_processus(pid_t pid, enum s # ifndef OS2 // SysV if (shmdt(queue) != 0) { + sem_close(signalisation); return(1); } # else // OS/2 @@ -2958,12 +2977,14 @@ envoi_signal_processus(pid_t pid, enum s { munmap(queue, sizeof(struct_queue_signaux)); close(segment); + sem_close(signalisation); return(1); } if (munmap(queue, sizeof(struct_queue_signaux)) != 0) { close(segment); + sem_close(signalisation); return(1); } @@ -2972,6 +2993,7 @@ envoi_signal_processus(pid_t pid, enum s # ifndef OS2 // SysV if (shmdt(queue) != 0) { + sem_close(signalisation); return(1); } # else // OS/2 @@ -3448,25 +3470,6 @@ creation_queue_signaux(struct_processus 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); - - if (getpid() == (*s_queue_signaux).controle) - { - arret_thread_signaux(s_etat_processus); - pthread_join((*s_queue_signaux).thread_signaux, NULL); - } - # ifdef IPCS_SYSV // SystemV # ifndef OS2 if (shmdt(s_queue_signaux) == -1) @@ -3526,8 +3529,8 @@ destruction_queue_signaux(struct_process // Incrémenter le sémaphore pour être sûr de le débloquer. sem_post(semaphore_signalisation); - arret_thread_signaux(s_etat_processus); pthread_join((*s_queue_signaux).thread_signaux, NULL); + arret_thread_signaux(s_etat_processus); # ifdef IPCS_SYSV // SystemV # ifndef OS2