--- rpl/src/instructions_s1.c 2018/05/30 09:27:37 1.90 +++ rpl/src/instructions_s1.c 2019/02/07 15:47:41 1.98 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.29 - Copyright (C) 1989-2018 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.31 + Copyright (C) 1989-2019 Dr. BERTRAND Joël This file is part of RPL/2. @@ -59,34 +59,34 @@ instruction_swap(struct_processus *s_eta " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" - " %s\n", + " %s, %s\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX, d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK, - d_SLB, d_PRC, d_MTX, d_SQL); + d_SLB, d_PRC, d_MTX, d_SQL, d_REC); printf(" 1: %s, %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" - " %s\n", + " %s, %s\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX, d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK, - d_SLB, d_PRC, d_MTX, d_SQL); + d_SLB, d_PRC, d_MTX, d_SQL, d_REC); printf("-> 2: %s, %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" - " %s\n", + " %s, %s\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX, d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK, - d_SLB, d_PRC, d_MTX, d_SQL); + d_SLB, d_PRC, d_MTX, d_SQL, d_REC); printf(" 1: %s, %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" - " %s\n", + " %s, %s\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX, d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK, - d_SLB, d_PRC, d_MTX, d_SQL); + d_SLB, d_PRC, d_MTX, d_SQL, d_REC); return; } @@ -3155,10 +3155,10 @@ instruction_sto(struct_processus *s_etat " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" - " %s\n", + " %s, %s\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX, d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK, - d_SLB, d_PRC, d_MTX, d_SQL); + d_SLB, d_PRC, d_MTX, d_SQL, d_REC); printf(" 1: %s\n", d_NOM); return; @@ -3415,8 +3415,8 @@ instruction_syseval(struct_processus *s_ unsigned char *tampon; integer8 longueur_lecture; + integer8 longueur_lue; integer8 longueur_tampon; - integer8 nombre_iterations; integer8 nombre_lignes; integer8 pointeur; integer8 registre_position_courante; @@ -3688,7 +3688,6 @@ instruction_syseval(struct_processus *s_ fflush(NULL); - verrouillage_threads_concurrents(s_etat_processus); pid = fork(); if (pid < 0) @@ -3821,8 +3820,6 @@ instruction_syseval(struct_processus *s_ } else { - deverrouillage_threads_concurrents(s_etat_processus); - if (close(pipes_entree[0]) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -3967,65 +3964,9 @@ instruction_syseval(struct_processus *s_ return; } - do - { - if (kill(pid, 0) != 0) - { - break; - } - - /* - * Récupération de la valeur de retour du processus détaché - */ - -# 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(waitpid(pid, &status, 0) == -1) - { - 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; - } - } - -# 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; - } - } - } while((!WIFEXITED(status)) && (!WIFSIGNALED(status))); - - longueur_lecture = 256; + longueur_lecture = 65536; + longueur_lue = 0; pointeur = 0; - nombre_iterations = 1; if ((tampon = malloc(((size_t) (longueur_lecture + 1)) * sizeof(unsigned char))) == NULL) @@ -4060,12 +4001,12 @@ instruction_syseval(struct_processus *s_ return; } + longueur_lue += ios; tampon[pointeur + ios] = d_code_fin_chaine; - pointeur += longueur_lecture; - nombre_iterations++; + pointeur += ios; if ((tampon = realloc(tampon, - ((size_t) ((nombre_iterations * longueur_lecture) + 1)) + ((size_t) ((longueur_lue + longueur_lecture) + 1)) * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = @@ -4085,17 +4026,59 @@ instruction_syseval(struct_processus *s_ } # ifndef SEMAPHORES_NOMMES - while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) + if (sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) # else - while(sem_wait((*s_etat_processus).semaphore_fork) != 0) + if (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; + } + + /* + * Récupération de la valeur de retour du processus détaché + */ + +# 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(waitpid(pid, &status, 0) == -1) + { + if (errno != EINTR) + { + (*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; + } + } + } while((!WIFEXITED(status)) && (!WIFSIGNALED(status))); if (ios == -1) {