--- rpl/src/instructions_p7.c 2013/09/06 10:30:54 1.57 +++ rpl/src/instructions_p7.c 2020/01/10 11:15:47 1.84 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.16 - Copyright (C) 1989-2013 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.32 + Copyright (C) 1989-2020 Dr. BERTRAND Joël This file is part of RPL/2. @@ -750,10 +750,28 @@ instruction_poke(struct_processus *s_eta // figure ! action.sa_handler = SIG_IGN; - action.sa_flags = SA_ONSTACK; + action.sa_flags = 0; + +# ifndef SEMAPHORES_NOMMES + if (sem_post(&((*s_etat_processus).semaphore_fork)) + != 0) +# else + if (sem_post((*s_etat_processus).semaphore_fork) != 0) +# endif + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + + if (pthread_mutex_lock(&mutex_sigaction) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } if (sigaction(SIGPIPE, &action, ®istre) != 0) { + pthread_mutex_unlock(&mutex_sigaction); pthread_mutex_unlock(&((*s_etat_processus) .mutex_pile_processus)); @@ -767,7 +785,7 @@ instruction_poke(struct_processus *s_eta if (envoi_signal_processus((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)) - .thread).pid, rpl_siginject) != 0) + .thread).pid, rpl_siginject, d_faux) != 0) { // Le processus fils peut s'être terminé. break; @@ -785,47 +803,22 @@ instruction_poke(struct_processus *s_eta if ((*s_etat_processus).erreur_systeme != d_es) { + pthread_mutex_unlock(&mutex_sigaction); pthread_mutex_unlock(&((*s_etat_processus) .mutex_pile_processus)); return; } } -# ifndef SEMAPHORES_NOMMES - if (sem_post(&((*s_etat_processus).semaphore_fork)) - != 0) -# else - if (sem_post((*s_etat_processus).semaphore_fork) != 0) -# endif - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - while((longueur_ecriture = write_atomic(s_etat_processus, (*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread) .pipe_nombre_injections[1], "-", sizeof(unsigned char))) != sizeof(unsigned char)) { -# ifndef SEMAPHORES_NOMMES - while(sem_wait( - &((*s_etat_processus).semaphore_fork)) != 0) -# else - while(sem_wait( - (*s_etat_processus).semaphore_fork) != 0) -# endif - { - if (errno != EINTR) - { - (*s_etat_processus).erreur_systeme = - d_es_processus; - return; - } - } - if (longueur_ecriture == -1) { + pthread_mutex_unlock(&mutex_sigaction); pthread_mutex_unlock(&((*s_etat_processus) .mutex_pile_processus)); @@ -854,6 +847,7 @@ instruction_poke(struct_processus *s_eta if (sigaction(SIGPIPE, ®istre, NULL) != 0) { + pthread_mutex_unlock(&mutex_sigaction); (*s_etat_processus).erreur_systeme = d_es_signal; return; @@ -861,18 +855,6 @@ instruction_poke(struct_processus *s_eta return; } - -# ifndef SEMAPHORES_NOMMES - if (sem_post( - &((*s_etat_processus).semaphore_fork)) != 0) -# else - if (sem_post( - (*s_etat_processus).semaphore_fork) != 0) -# endif - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } } if (ecriture_pipe(s_etat_processus, @@ -889,20 +871,6 @@ instruction_poke(struct_processus *s_eta } } -# ifndef SEMAPHORES_NOMMES - while(sem_wait(&((*s_etat_processus).semaphore_fork)) - != 0) -# else - while(sem_wait((*s_etat_processus).semaphore_fork) != 0) -# endif - { - if (errno != EINTR) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - } - if (registre_stop == 0) { if ((*s_etat_processus) @@ -923,6 +891,7 @@ instruction_poke(struct_processus *s_eta if (sigaction(SIGPIPE, ®istre, NULL) != 0) { + pthread_mutex_unlock(&mutex_sigaction); pthread_mutex_unlock(&((*s_etat_processus) .mutex_pile_processus)); @@ -930,6 +899,26 @@ instruction_poke(struct_processus *s_eta return; } + if (pthread_mutex_unlock(&mutex_sigaction) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus).semaphore_fork)) + != 0) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) != 0) +# endif + { + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } + break; } } @@ -956,11 +945,61 @@ instruction_poke(struct_processus *s_eta // de lecteur et on peut se prendre un SIGPIPE dans la // figure ! +# ifndef SEMAPHORES_NOMMES + if (sem_post(&((*s_etat_processus).semaphore_fork)) + != 0) +# else + if (sem_post((*s_etat_processus).semaphore_fork) != 0) +# endif + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + + if (pthread_mutex_lock(&mutex_sigaction) != 0) + { +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus) + .semaphore_fork)) != 0) +# else + while(sem_wait((*s_etat_processus) + .semaphore_fork) != 0) +# endif + { + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + return; + } + } + + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + action.sa_handler = SIG_IGN; - action.sa_flags = SA_ONSTACK; + action.sa_flags = 0; if (sigaction(SIGPIPE, &action, ®istre) != 0) { +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus) + .semaphore_fork)) != 0) +# else + while(sem_wait((*s_etat_processus) + .semaphore_fork) != 0) +# endif + { + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + return; + } + } + + pthread_mutex_unlock(&mutex_sigaction); pthread_mutex_unlock(&((*s_etat_processus) .mutex_pile_processus)); @@ -976,6 +1015,23 @@ instruction_poke(struct_processus *s_eta (*(*l_element_courant).donnee).objet)).thread) .mutex)) != 0) { +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus) + .semaphore_fork)) != 0) +# else + while(sem_wait((*s_etat_processus) + .semaphore_fork) != 0) +# endif + { + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + return; + } + } + + pthread_mutex_unlock(&mutex_sigaction); (*s_etat_processus).erreur_systeme = d_es_processus; return; } @@ -984,7 +1040,8 @@ instruction_poke(struct_processus *s_eta (*(*l_element_courant).donnee).objet)).thread) .thread_actif == d_vrai) { - if (envoi_signal_thread((*(*((struct_processus_fils *) + if (envoi_signal_thread(NULL, + (*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread) .tid, rpl_siginject) != 0) { @@ -995,6 +1052,23 @@ instruction_poke(struct_processus *s_eta (*(*l_element_courant).donnee).objet)) .thread).mutex)) != 0) { +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus) + .semaphore_fork)) != 0) +# else + while(sem_wait((*s_etat_processus) + .semaphore_fork) != 0) +# endif + { + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + return; + } + } + + pthread_mutex_unlock(&mutex_sigaction); (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1010,6 +1084,23 @@ instruction_poke(struct_processus *s_eta (*(*l_element_courant).donnee).objet)) .thread).mutex)) != 0) { +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus) + .semaphore_fork)) != 0) +# else + while(sem_wait((*s_etat_processus) + .semaphore_fork) != 0) +# endif + { + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + return; + } + } + + pthread_mutex_unlock(&mutex_sigaction); (*s_etat_processus).erreur_systeme = d_es_processus; return; } @@ -1021,6 +1112,23 @@ instruction_poke(struct_processus *s_eta (*(*l_element_courant).donnee).objet)).thread) .mutex)) != 0) { +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus) + .semaphore_fork)) != 0) +# else + while(sem_wait((*s_etat_processus) + .semaphore_fork) != 0) +# endif + { + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + return; + } + } + + pthread_mutex_unlock(&mutex_sigaction); (*s_etat_processus).erreur_systeme = d_es_processus; return; } @@ -1037,46 +1145,35 @@ instruction_poke(struct_processus *s_eta if ((*s_etat_processus).erreur_systeme != d_es) { +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus) + .semaphore_fork)) != 0) +# else + while(sem_wait((*s_etat_processus) + .semaphore_fork) != 0) +# endif + { + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + return; + } + } + + pthread_mutex_unlock(&mutex_sigaction); pthread_mutex_unlock(&((*s_etat_processus) .mutex_pile_processus)); return; } } -# ifndef SEMAPHORES_NOMMES - if (sem_post( - &((*s_etat_processus).semaphore_fork)) != 0) -# else - if (sem_post( - (*s_etat_processus).semaphore_fork) != 0) -# endif - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - while((longueur_ecriture = write_atomic(s_etat_processus, (*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread) .pipe_nombre_injections[1], "-", sizeof(unsigned char))) != sizeof(unsigned char)) { -# ifndef SEMAPHORES_NOMMES - while(sem_wait( - &((*s_etat_processus).semaphore_fork)) != 0) -# else - while(sem_wait( - (*s_etat_processus).semaphore_fork) != 0) -# endif - { - if (errno != EINTR) - { - (*s_etat_processus).erreur_systeme = - d_es_processus; - return; - } - } - if (longueur_ecriture == -1) { pthread_mutex_unlock(&((*s_etat_processus) @@ -1107,23 +1204,45 @@ instruction_poke(struct_processus *s_eta if (sigaction(SIGPIPE, ®istre, NULL) != 0) { +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus) + .semaphore_fork)) != 0) +# else + while(sem_wait((*s_etat_processus) + .semaphore_fork) != 0) +# endif + { + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + return; + } + } + + pthread_mutex_unlock(&mutex_sigaction); (*s_etat_processus).erreur_systeme = d_es_signal; return; } - return; - } +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus) + .semaphore_fork)) != 0) +# else + while(sem_wait((*s_etat_processus) + .semaphore_fork) != 0) +# endif + { + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + return; + } + } -# ifndef SEMAPHORES_NOMMES - if (sem_post( - &((*s_etat_processus).semaphore_fork)) != 0) -# else - if (sem_post( - (*s_etat_processus).semaphore_fork) != 0) -# endif - { - (*s_etat_processus).erreur_systeme = d_es_processus; + pthread_mutex_unlock(&mutex_sigaction); return; } } @@ -1142,21 +1261,6 @@ instruction_poke(struct_processus *s_eta } } -# ifndef SEMAPHORES_NOMMES - while(sem_wait( - &((*s_etat_processus).semaphore_fork)) != 0) -# else - while(sem_wait( - (*s_etat_processus).semaphore_fork) != 0) -# endif - { - if (errno != EINTR) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - } - if (registre_stop == 0) { if ((*s_etat_processus) @@ -1177,6 +1281,23 @@ instruction_poke(struct_processus *s_eta if (sigaction(SIGPIPE, ®istre, NULL) != 0) { +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus) + .semaphore_fork)) != 0) +# else + while(sem_wait((*s_etat_processus) + .semaphore_fork) != 0) +# endif + { + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + return; + } + } + + pthread_mutex_unlock(&mutex_sigaction); pthread_mutex_unlock(&((*s_etat_processus) .mutex_pile_processus)); @@ -1184,6 +1305,42 @@ instruction_poke(struct_processus *s_eta return; } + if (pthread_mutex_unlock(&mutex_sigaction) != 0) + { +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus) + .semaphore_fork)) != 0) +# else + while(sem_wait((*s_etat_processus) + .semaphore_fork) != 0) +# endif + { + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + return; + } + } + + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus).semaphore_fork)) + != 0) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) != 0) +# endif + { + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } + break; } }