--- rpl/src/instructions_s9.c 2012/10/07 08:18:36 1.53 +++ rpl/src/instructions_s9.c 2020/01/10 11:15:48 1.87 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.11 - Copyright (C) 1989-2012 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. @@ -60,12 +60,11 @@ instruction_sort(struct_processus *s_eta struct_objet *s_objet_registre; struct_objet *s_objet_test; - signed long indice_i; - signed long indice_j; - signed long indice_k; - signed long indice_l; - - unsigned long ecartement; + integer8 ecartement; + integer8 indice_i; + integer8 indice_j; + integer8 indice_k; + integer8 indice_l; (*s_etat_processus).erreur_execution = d_ex; @@ -154,26 +153,12 @@ instruction_sort(struct_processus *s_eta if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL) { - if (pthread_mutex_lock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - if (recherche_variable_partagee(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).nom, (*(*s_etat_processus).pointeur_variable_courante) .variable_partagee, (*(*s_etat_processus) - .pointeur_variable_courante).origine) == d_faux) + .pointeur_variable_courante).origine) == NULL) { - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; @@ -183,15 +168,12 @@ instruction_sort(struct_processus *s_eta return; } - if (((*(*(*s_etat_processus).s_liste_variables_partagees) - .table[(*(*s_etat_processus).s_liste_variables_partagees) - .position_variable].objet).type != LST) && - ((*(*(*s_etat_processus).s_liste_variables_partagees) - .table[(*(*s_etat_processus).s_liste_variables_partagees) - .position_variable].objet).type != TBL)) + if (((*(*(*s_etat_processus).pointeur_variable_partagee_courante) + .objet).type != LST) && ((*(*(*s_etat_processus) + .pointeur_variable_partagee_courante).objet).type != TBL)) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -208,15 +190,14 @@ instruction_sort(struct_processus *s_eta liberation(s_etat_processus, s_objet_liste); - s_objet_liste = (*(*s_etat_processus).s_liste_variables_partagees) - .table[(*(*s_etat_processus).s_liste_variables_partagees) - .position_variable].objet; + s_objet_liste = (*(*s_etat_processus) + .pointeur_variable_partagee_courante).objet; if ((s_objet_copie = copie_objet(s_etat_processus, s_objet_liste, 'N')) == NULL) { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -594,7 +575,7 @@ instruction_sort(struct_processus *s_eta else { if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -619,12 +600,11 @@ instruction_sort(struct_processus *s_eta { if (variable_partagee == d_vrai) { - (*(*s_etat_processus).s_liste_variables_partagees) - .table[(*(*s_etat_processus).s_liste_variables_partagees) - .position_variable].objet = s_objet_liste; + (*(*s_etat_processus).pointeur_variable_partagee_courante).objet = + s_objet_liste; if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -677,10 +657,10 @@ instruction_save(struct_processus *s_eta " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s,\n" - " %s, %s\n", + " %s, %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_SQL, d_SLB, d_PRC, d_MTX); + d_SQL, d_SLB, d_PRC, d_MTX, d_REC); printf(" 1: %s\n", d_NOM); return; @@ -1171,10 +1151,6 @@ instruction_swi(struct_processus *s_etat integer8 interruption; - pid_t pid; - - pthread_t tid; - sig_atomic_t registre; ssize_t longueur_ecriture; @@ -1183,6 +1159,7 @@ instruction_swi(struct_processus *s_etat struct timespec attente; + unsigned char caractere; unsigned char tampon; (*s_etat_processus).erreur_execution = d_ex; @@ -1251,172 +1228,7 @@ instruction_swi(struct_processus *s_etat registre = (*s_etat_processus).var_volatile_traitement_retarde_stop; (*s_etat_processus).var_volatile_traitement_retarde_stop = 1; - if ((*s_etat_processus).processus_detache == d_vrai) - { - pid = -1; - - attente.tv_sec = 0; - attente.tv_nsec = GRANULARITE_us * 1000; - -# 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, - (*s_etat_processus).pipe_nombre_objets_attente, - &pid, sizeof(pid))) != sizeof(pid)) - { -# 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) - { - if (registre == 0) - { - if ((*s_etat_processus) - .var_volatile_traitement_retarde_stop == -1) - { - (*s_etat_processus).var_volatile_requete_arret = -1; - } - - (*s_etat_processus) - .var_volatile_traitement_retarde_stop - = registre; - } - - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - - nanosleep(&attente, NULL); - INCR_GRANULARITE(attente.tv_nsec); - -# 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; - } - } - - scrutation_interruptions(s_etat_processus); - -# 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; - } - } - } - else - { - tid = (pthread_t) -1; - - attente.tv_sec = 0; - attente.tv_nsec = GRANULARITE_us * 1000; - -# 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, - (*s_etat_processus).pipe_nombre_objets_attente, - &tid, sizeof(tid))) != sizeof(tid)) - { -# 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) - { - if (registre == 0) - { - if ((*s_etat_processus) - .var_volatile_traitement_retarde_stop == -1) - { - (*s_etat_processus).var_volatile_requete_arret = -1; - } - - (*s_etat_processus) - .var_volatile_traitement_retarde_stop - = registre; - } - - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - - nanosleep(&attente, NULL); - INCR_GRANULARITE(attente.tv_nsec); - -# 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; - } - } - - scrutation_interruptions(s_etat_processus); - -# 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; - } - } - } - - interruption_reduite = interruption; + interruption_reduite = (int) interruption; attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; @@ -1499,7 +1311,7 @@ instruction_swi(struct_processus *s_etat if ((*s_etat_processus).processus_detache == d_vrai) { - pid = -3; + caractere = 2; attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; @@ -1515,8 +1327,8 @@ instruction_swi(struct_processus *s_etat } while((longueur_ecriture = write_atomic(s_etat_processus, - (*s_etat_processus).pipe_nombre_interruptions_attente, - &pid, sizeof(pid))) != sizeof(pid)) + (*s_etat_processus).pipe_nombre_elements_attente, + &caractere, sizeof(caractere))) != sizeof(caractere)) { # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) @@ -1566,61 +1378,6 @@ instruction_swi(struct_processus *s_etat scrutation_interruptions(s_etat_processus); } - pid = getpid(); - - attente.tv_sec = 0; - attente.tv_nsec = GRANULARITE_us * 1000; - - while((longueur_ecriture = write_atomic(s_etat_processus, - (*s_etat_processus).pipe_nombre_interruptions_attente, - &pid, sizeof(pid))) != sizeof(pid)) - { -# 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) - { - if (registre == 0) - { - if ((*s_etat_processus) - .var_volatile_traitement_retarde_stop == -1) - { - (*s_etat_processus).var_volatile_requete_arret = -1; - } - - (*s_etat_processus) - .var_volatile_traitement_retarde_stop - = registre; - } - - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - - nanosleep(&attente, NULL); - INCR_GRANULARITE(attente.tv_nsec); - -# 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; - } - } - # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) # else @@ -1636,7 +1393,7 @@ instruction_swi(struct_processus *s_etat } else { - tid = (pthread_t) -3; + caractere = 2; # ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) @@ -1649,65 +1406,8 @@ instruction_swi(struct_processus *s_etat } while((longueur_ecriture = write_atomic(s_etat_processus, - (*s_etat_processus).pipe_nombre_interruptions_attente, - &tid, sizeof(tid))) != sizeof(tid)) - { -# 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) - { - if (registre == 0) - { - if ((*s_etat_processus) - .var_volatile_traitement_retarde_stop == -1) - { - (*s_etat_processus).var_volatile_requete_arret = -1; - } - - (*s_etat_processus) - .var_volatile_traitement_retarde_stop - = registre; - } - - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - - nanosleep(&attente, NULL); - INCR_GRANULARITE(attente.tv_nsec); - -# 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; - } - - scrutation_interruptions(s_etat_processus); - } - - tid = pthread_self(); - - attente.tv_sec = 0; - attente.tv_nsec = GRANULARITE_us * 1000; - - while((longueur_ecriture = write_atomic(s_etat_processus, - (*s_etat_processus).pipe_nombre_interruptions_attente, - &tid, sizeof(tid))) != sizeof(tid)) + (*s_etat_processus).pipe_nombre_elements_attente, + &caractere, sizeof(caractere))) != sizeof(caractere)) { # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) @@ -1723,7 +1423,6 @@ instruction_swi(struct_processus *s_etat } if (longueur_ecriture == -1) - { if (registre == 0) {