--- rpl/src/instructions_s1.c 2019/02/07 15:47:41 1.98 +++ rpl/src/instructions_s1.c 2019/02/12 14:38:43 1.102 @@ -3406,6 +3406,8 @@ instruction_syseval(struct_processus *s_ struct sigaction action_courante; struct sigaction action_passee; + struct timespec attente; + unsigned char *ligne; unsigned char *ptr; unsigned char *ptr2; @@ -3651,23 +3653,6 @@ instruction_syseval(struct_processus *s_ l_element_courant = (*l_element_courant).suivant; } - action_courante.sa_handler = SIG_IGN; - action_courante.sa_flags = SA_NODEFER | SA_ONSTACK; - - if (sigaction(SIGINT, &action_courante, &action_passee) != 0) - { - for(i = 0; i < nombre_arguments; i++) - { - depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), - &s_objet_temporaire); - liberation(s_etat_processus, s_objet_temporaire); - } - - free(arguments); - (*s_etat_processus).erreur_systeme = d_es_signal; - return; - } - if (pipe(pipes_entree) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -3688,6 +3673,54 @@ instruction_syseval(struct_processus *s_ fflush(NULL); + attente.tv_sec = 0; + attente.tv_nsec = GRANULARITE_us * 1000; + + while(pthread_mutex_trylock(&mutex_sigaction) != 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; + } + + nanosleep(&attente, NULL); + INCR_GRANULARITE(attente.tv_nsec); + +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) != 0) +# endif + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } + + action_courante.sa_handler = SIG_IGN; + action_courante.sa_flags = 0; + + if (sigaction(SIGINT, &action_courante, &action_passee) != 0) + { + for(i = 0; i < nombre_arguments; i++) + { + depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), + &s_objet_temporaire); + liberation(s_etat_processus, s_objet_temporaire); + } + + free(arguments); + (*s_etat_processus).erreur_systeme = d_es_signal; + return; + } + + verrouillage_threads_concurrents(s_etat_processus); + pid = fork(); if (pid < 0) @@ -3820,6 +3853,29 @@ instruction_syseval(struct_processus *s_ } else { + if (sigaction(SIGINT, &action_passee, NULL) != 0) + { + for(i = 0; i < nombre_arguments; i++) + { + depilement(s_etat_processus, + &((*s_etat_processus).l_base_pile), + &s_objet_temporaire); + liberation(s_etat_processus, s_objet_temporaire); + } + + free(arguments); + (*s_etat_processus).erreur_systeme = d_es_signal; + return; + } + + if (pthread_mutex_unlock(&mutex_sigaction) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + + deverrouillage_threads_concurrents(s_etat_processus); + if (close(pipes_entree[0]) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -4026,13 +4082,16 @@ instruction_syseval(struct_processus *s_ } # ifndef SEMAPHORES_NOMMES - if (sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) # else - if (sem_wait((*s_etat_processus).semaphore_fork) != 0) + while(sem_wait((*s_etat_processus).semaphore_fork) != 0) # endif { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } } do @@ -4182,20 +4241,6 @@ instruction_syseval(struct_processus *s_ free(tampon); } - if (sigaction(SIGINT, &action_passee, NULL) != 0) - { - for(i = 0; i < nombre_arguments; i++) - { - depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), - &s_objet_temporaire); - liberation(s_etat_processus, s_objet_temporaire); - } - - free(arguments); - (*s_etat_processus).erreur_systeme = d_es_signal; - return; - } - for(i = 0; i < nombre_arguments; i++) { depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), @@ -4203,6 +4248,8 @@ instruction_syseval(struct_processus *s_ liberation(s_etat_processus, s_objet_temporaire); } + free(arguments); + if ((tampon = malloc(sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -4272,7 +4319,6 @@ instruction_syseval(struct_processus *s_ return; } - free(arguments); free(tampon); } else