--- rpl/src/interruptions.c 2016/03/22 09:22:23 1.173 +++ rpl/src/interruptions.c 2016/04/01 11:26:21 1.177 @@ -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; } @@ -2493,6 +2494,11 @@ scrutation_interruptions(struct_processu return; } } + + if ((*s_queue_signaux).requete_arret == d_vrai) + { + break; + } } sem_post(semaphore_queue_signaux); @@ -2786,6 +2792,7 @@ envoi_signal_processus(pid_t pid, enum s if (msync(queue, sizeof(queue), MS_ASYNC | MS_INVALIDATE) != 0) { munmap(queue, sizeof(struct_queue_signaux)); + close(segment); return(1); } @@ -2794,6 +2801,8 @@ envoi_signal_processus(pid_t pid, enum s close(segment); return(1); } + + close(segment); # else // IPCS_SYSV # ifndef OS2 // SysV if (shmdt(queue) != 0) @@ -2804,7 +2813,6 @@ envoi_signal_processus(pid_t pid, enum s // Pendant de DosGetNamedSHaredMem() # endif # endif - return(1); } @@ -2815,18 +2823,24 @@ envoi_signal_processus(pid_t pid, enum s if (msync(queue, sizeof(queue), MS_ASYNC | MS_INVALIDATE) != 0) { 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); } + + close(segment); # else // IPCS_SYSV # ifndef OS2 // SysV if (shmdt(queue) != 0) { + sem_close(semaphore); return(1); } # else // OS/2 @@ -2847,18 +2861,27 @@ 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); - } + return(1); + } + + close(segment); # else // IPCS_SYSV # ifndef OS2 // SysV if (shmdt(queue) != 0) { + sem_close(semaphore); + sem_close(signalisation); return(1); } # else // OS/2 @@ -2884,18 +2907,27 @@ envoi_signal_processus(pid_t pid, enum s if (msync(queue, sizeof(queue), MS_ASYNC | MS_INVALIDATE) != 0) { 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); } + + close(segment); # else // IPCS_SYSV # ifndef OS2 // SysV if (shmdt(queue) != 0) { + sem_close(semaphore); + sem_close(signalisation); return(1); } # else // OS/2 @@ -2914,18 +2946,24 @@ envoi_signal_processus(pid_t pid, enum s if (msync(queue, sizeof(queue), MS_ASYNC | MS_INVALIDATE) != 0) { 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); } + + close(segment); # else // IPCS_SYSV # ifndef OS2 // SysV if (shmdt(queue) != 0) { + sem_close(signalisation); return(1); } # else // OS/2 @@ -2943,18 +2981,24 @@ envoi_signal_processus(pid_t pid, enum s if (msync(queue, sizeof(queue), MS_ASYNC | MS_INVALIDATE) != 0) { 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); } + + close(segment); # else // IPCS_SYSV # ifndef OS2 // SysV if (shmdt(queue) != 0) { + sem_close(signalisation); return(1); } # else // OS/2 @@ -2972,6 +3016,7 @@ envoi_signal_processus(pid_t pid, enum s if (msync(queue, sizeof(queue), MS_ASYNC | MS_INVALIDATE) != 0) { munmap(queue, sizeof(struct_queue_signaux)); + close(segment); return(1); } @@ -2980,6 +3025,8 @@ envoi_signal_processus(pid_t pid, enum s close(segment); return(1); } + + close(segment); # else // IPCS_SYSV # ifndef OS2 // SysV if (shmdt(queue) != 0) @@ -2998,6 +3045,7 @@ envoi_signal_processus(pid_t pid, enum s if (msync(queue, sizeof(queue), MS_ASYNC | MS_INVALIDATE) != 0) { munmap(queue, sizeof(struct_queue_signaux)); + close(segment); return(1); } @@ -3008,7 +3056,6 @@ envoi_signal_processus(pid_t pid, enum s } close(segment); - # else // IPCS_SYSV # ifndef OS2 // SysV if (shmdt(queue) != 0) @@ -3428,25 +3475,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) @@ -3506,8 +3534,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