--- rpl/src/instructions_s1.c 2019/01/29 07:51:19 1.95 +++ rpl/src/instructions_s1.c 2019/02/12 14:38:43 1.102 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.30 + RPL/2 (R) version 4.1.31 Copyright (C) 1989-2019 Dr. BERTRAND Joël This file is part of RPL/2. @@ -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,7 +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) @@ -3821,6 +3853,27 @@ 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) @@ -4028,10 +4081,24 @@ instruction_syseval(struct_processus *s_ } } +# 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; + } + } + do { if (kill(pid, 0) != 0) { + // Le processus n'existe plus. break; } @@ -4053,18 +4120,6 @@ instruction_syseval(struct_processus *s_ { if (errno != EINTR) { -# 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; - } - (*s_etat_processus).erreur_systeme = d_es_processus; return; } @@ -4084,19 +4139,6 @@ instruction_syseval(struct_processus *s_ } } while((!WIFEXITED(status)) && (!WIFSIGNALED(status))); -# 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 (ios == -1) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -4199,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), @@ -4220,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; @@ -4289,7 +4319,6 @@ instruction_syseval(struct_processus *s_ return; } - free(arguments); free(tampon); } else