--- rpl/src/interruptions.c 2016/03/18 12:43:48 1.171 +++ rpl/src/interruptions.c 2016/04/06 21:14:56 1.179 @@ -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. @@ -1524,7 +1524,6 @@ lancement_thread_signaux(struct_processu if (pipe((*s_etat_processus).pipe_signaux) != 0) { -perror("pipe"); (*s_etat_processus).erreur_systeme = d_es_processus; return(d_erreur); } @@ -2481,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; } @@ -2732,11 +2732,26 @@ envoi_signal_processus(pid_t pid, enum s queue = shmat(segment, NULL, 0); # else // OS/2 - if (DosGetNamedSharedMem((PVOID) &queue, nom, - PAG_WRITE | PAG_READ) != 0) + if (test_ouverture == d_vrai) { - sys_free(nom); - return(1); + attente.tv_sec = 0; + attente.tv_nsec = GRANULARITE_us * 1000; + + while(DosGetNamedSharedMem((PVOID) &queue, nom, + PAG_WRITE | PAG_READ) != 0) + { + nanosleep(&attente, NULL); + INCR_GRANULARITE(attente.tv_nsec); + } + } + else + { + if (DosGetNamedSharedMem((PVOID) &queue, nom, + PAG_WRITE | PAG_READ) != 0) + { + sys_free(nom); + return(1); + } } sys_free(nom); @@ -2781,13 +2796,13 @@ envoi_signal_processus(pid_t pid, enum s // À ce moment, le segment de mémoire partagée est projeté // dans l'espace du processus. - if ((semaphore = sem_open2(pid, SEM_QUEUE)) == SEM_FAILED) { # ifndef IPCS_SYSV // POSIX if (msync(queue, sizeof(queue), MS_ASYNC | MS_INVALIDATE) != 0) { munmap(queue, sizeof(struct_queue_signaux)); + close(segment); return(1); } @@ -2796,6 +2811,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) @@ -2806,7 +2823,6 @@ envoi_signal_processus(pid_t pid, enum s // Pendant de DosGetNamedSHaredMem() # endif # endif - return(1); } @@ -2817,18 +2833,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 @@ -2849,18 +2871,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 @@ -2886,18 +2917,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 @@ -2916,18 +2956,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 @@ -2945,18 +2991,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 @@ -2974,6 +3026,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); } @@ -2982,6 +3035,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) @@ -3000,6 +3055,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,6 +3064,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) @@ -3143,12 +3201,33 @@ creation_queue_signaux(struct_processus return; } - if ((f_queue_signaux = shm_open(nom, O_RDWR | O_CREAT /* | O_EXCL*/, + if ((f_queue_signaux = shm_open(nom, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR)) == -1) { - sys_free(nom); - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return; + if (errno != EEXIST) + { + sys_free(nom); + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + if ((*s_etat_processus).langue == 'F') + { + printf("+++Attention : Le segment de mémoire %s préexiste !\n", + nom); + } + else + { + printf("+++Warning: %s memory segment preexists!\n", nom); + } + + if ((f_queue_signaux = shm_open(nom, O_RDWR | O_CREAT | O_TRUNC, + S_IRUSR | S_IWUSR)) == -1) + { + sys_free(nom); + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } } if (ftruncate(f_queue_signaux, sizeof(struct_queue_signaux)) == -1) @@ -3406,25 +3485,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) @@ -3484,8 +3544,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