--- rpl/src/interruptions.c 2016/03/17 16:31:36 1.170 +++ rpl/src/interruptions.c 2016/07/20 16:23:59 1.180 @@ -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. @@ -1549,6 +1549,12 @@ lancement_thread_signaux(struct_processu return(d_erreur); } + if (pthread_attr_destroy(&attributs) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return(d_erreur); + } + return(d_absence_erreur); } @@ -1573,9 +1579,7 @@ arret_thread_signaux(struct_processus *s pthread_join((*s_etat_processus).thread_signaux, NULL); - close((*s_etat_processus).pipe_signaux[0]); close((*s_etat_processus).pipe_signaux[1]); - return(d_absence_erreur); } @@ -1596,20 +1600,26 @@ thread_signaux(void *argument) pipe = (*s_etat_processus).pipe_signaux; fds.fd = pipe[0]; fds.events = POLLIN; - fds.revents = 0; sigfillset(&masque); pthread_sigmask(SIG_BLOCK, &masque, NULL); do { - if (poll(&fds, 1, -1) == -1) + fds.revents = 0; + + while(poll(&fds, 1, -1) == -1) { - pthread_exit(NULL); + if (errno != EINTR) + { + close((*s_etat_processus).pipe_signaux[0]); + pthread_exit(NULL); + } } if (read_atomic(s_etat_processus, fds.fd, &signal, 1) != 1) { + close((*s_etat_processus).pipe_signaux[0]); pthread_exit(NULL); } @@ -1621,6 +1631,7 @@ thread_signaux(void *argument) } } while(signal != (0xFF & rpl_sigmax)); + close((*s_etat_processus).pipe_signaux[0]); pthread_exit(NULL); } @@ -2480,6 +2491,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; } @@ -2731,11 +2743,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); @@ -2780,13 +2807,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); } @@ -2795,6 +2822,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) @@ -2805,7 +2834,6 @@ envoi_signal_processus(pid_t pid, enum s // Pendant de DosGetNamedSHaredMem() # endif # endif - return(1); } @@ -2816,18 +2844,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 @@ -2848,18 +2882,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 @@ -2885,18 +2928,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 @@ -2915,18 +2967,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 @@ -2944,18 +3002,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 @@ -2973,6 +3037,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); } @@ -2981,6 +3046,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) @@ -2999,6 +3066,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); } @@ -3007,6 +3075,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) @@ -3145,9 +3215,30 @@ creation_queue_signaux(struct_processus 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) @@ -3331,29 +3422,12 @@ creation_queue_signaux(struct_processus return; } -# ifdef SCHED_OTHER - if (pthread_attr_setschedpolicy(&attributs, SCHED_OTHER) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } -# endif - -# ifdef PTHREAD_EXPLICIT_SCHED - if (pthread_attr_setinheritsched(&attributs, PTHREAD_EXPLICIT_SCHED) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } -# endif - -# ifdef PTHREAD_SCOPE_SYSTEM - if (pthread_attr_setscope(&attributs, PTHREAD_SCOPE_SYSTEM) != 0) + if (pthread_create(&((*s_queue_signaux).thread_signaux), &attributs, + thread_surveillance_signaux, s_etat_processus) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } -# endif if (pthread_attr_destroy(&attributs) != 0) { @@ -3361,13 +3435,6 @@ creation_queue_signaux(struct_processus return; } - if (pthread_create(&((*s_queue_signaux).thread_signaux), &attributs, - thread_surveillance_signaux, s_etat_processus) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - (*s_queue_signaux).controle = getpid(); # ifndef IPCS_SYSV @@ -3379,6 +3446,12 @@ creation_queue_signaux(struct_processus } # endif + if (lancement_thread_signaux(s_etat_processus) == d_erreur) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + return; } @@ -3399,25 +3472,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) @@ -3477,8 +3531,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