--- rpl/src/interruptions.c 2016/03/24 09:38:29 1.175 +++ rpl/src/interruptions.c 2016/04/01 13:33:27 1.178 @@ -106,7 +106,6 @@ thread_surveillance_signaux(void *argume break; } - sem_post(semaphore_arret_signalisation); sem_post(semaphore_signalisation); nombre_signaux_envoyes = 0; @@ -138,6 +137,7 @@ thread_surveillance_signaux(void *argume } sem_post(semaphore_queue_signaux); + sem_post(semaphore_arret_signalisation); // Dans un second temps, on balaye toutes les queues de signaux // des threads du processus courant. @@ -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); @@ -2818,12 +2824,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 +2840,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 +2861,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 +2880,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 +2908,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 +2926,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 +2947,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 +2963,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 +2982,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 +2998,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 +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) @@ -3526,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