--- rpl/src/interruptions.c 2016/03/16 12:19:34 1.169 +++ 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); @@ -2782,12 +2809,67 @@ envoi_signal_processus(pid_t pid, enum s 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); + } + + if (munmap(queue, sizeof(struct_queue_signaux)) != 0) + { + close(segment); + return(1); + } + + close(segment); +# else // IPCS_SYSV +# ifndef OS2 // SysV + if (shmdt(queue) != 0) + { + return(1); + } +# else // OS/2 + // Pendant de DosGetNamedSHaredMem() +# endif +# endif return(1); } if ((signalisation = sem_open2(pid, SEM_SIGNALISATION)) == SEM_FAILED) { +# ifndef IPCS_SYSV // POSIX + 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 + // Pendant de DosGetNamedSHaredMem() +# endif +# endif + + sem_close(semaphore); return(1); } @@ -2795,6 +2877,39 @@ envoi_signal_processus(pid_t pid, enum s { if (errno != EINTR) { +# ifndef IPCS_SYSV // POSIX + if (msync(queue, sizeof(queue), MS_ASYNC | MS_INVALIDATE) + != 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); + } + + close(segment); +# else // IPCS_SYSV +# ifndef OS2 // SysV + if (shmdt(queue) != 0) + { + sem_close(semaphore); + sem_close(signalisation); + return(1); + } +# else // OS/2 + // Pendant de DosGetNamedSHaredMem() +# endif +# endif + sem_close(semaphore); sem_close(signalisation); return(1); @@ -2807,17 +2922,40 @@ envoi_signal_processus(pid_t pid, enum s (*queue).pointeur_ecriture = ((*queue).pointeur_ecriture + 1) % LONGUEUR_QUEUE_SIGNAUX; -# ifndef IPCS_SYSV - if (msync(queue, sizeof(queue), MS_ASYNC | MS_INVALIDATE) != 0) - { - sem_close(semaphore); - sem_close(signalisation); - return(1); - } -# endif - if (sem_post(semaphore) != 0) { +# ifndef IPCS_SYSV // POSIX + 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 + // Pendant de DosGetNamedSHaredMem() +# endif +# endif + sem_close(semaphore); sem_close(signalisation); return(1); @@ -2825,26 +2963,120 @@ envoi_signal_processus(pid_t pid, enum s if (sem_close(semaphore) != 0) { +# ifndef IPCS_SYSV // POSIX + 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 + // Pendant de DosGetNamedSHaredMem() +# endif +# endif + + sem_close(signalisation); return(1); } if (sem_post(signalisation) != 0) { +# ifndef IPCS_SYSV // POSIX + 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 + // Pendant de DosGetNamedSHaredMem() +# endif +# endif + sem_close(signalisation); return(1); } if (sem_close(signalisation) != 0) { +# ifndef IPCS_SYSV // POSIX + if (msync(queue, sizeof(queue), MS_ASYNC | MS_INVALIDATE) != 0) + { + munmap(queue, sizeof(struct_queue_signaux)); + close(segment); + return(1); + } + + if (munmap(queue, sizeof(struct_queue_signaux)) != 0) + { + close(segment); + return(1); + } + + close(segment); +# else // IPCS_SYSV +# ifndef OS2 // SysV + if (shmdt(queue) != 0) + { + return(1); + } +# else // OS/2 + // Pendant de DosGetNamedSHaredMem() +# endif +# endif + return(1); } # ifndef IPCS_SYSV // POSIX + if (msync(queue, sizeof(queue), MS_ASYNC | MS_INVALIDATE) != 0) + { + munmap(queue, sizeof(struct_queue_signaux)); + close(segment); + return(1); + } + if (munmap(queue, sizeof(struct_queue_signaux)) != 0) { close(segment); return(1); } + + close(segment); # else // IPCS_SYSV # ifndef OS2 // SysV if (shmdt(queue) != 0) @@ -2983,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) @@ -3169,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) { @@ -3199,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 @@ -3217,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; } @@ -3237,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) @@ -3315,6 +3531,7 @@ destruction_queue_signaux(struct_process // Incrémenter le sémaphore pour être sûr de le débloquer. sem_post(semaphore_signalisation); + pthread_join((*s_queue_signaux).thread_signaux, NULL); arret_thread_signaux(s_etat_processus); # ifdef IPCS_SYSV // SystemV