--- rpl/src/instructions_s9.c 2010/01/26 15:22:45 1.1 +++ rpl/src/instructions_s9.c 2010/07/24 18:01:12 1.15 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.9 + RPL/2 (R) version 4.0.18 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. @@ -186,9 +186,12 @@ instruction_sort(struct_processus *s_eta return; } - if ((*(*(*s_etat_processus).s_liste_variables_partagees) + if (((*(*(*s_etat_processus).s_liste_variables_partagees) .table[(*(*s_etat_processus).s_liste_variables_partagees) - .position_variable].objet).type != LST) + .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 (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) @@ -230,9 +233,12 @@ instruction_sort(struct_processus *s_eta } else { - if ((*(*s_etat_processus).s_liste_variables + if (((*(*s_etat_processus).s_liste_variables + [(*s_etat_processus).position_variable_courante].objet) + .type != LST) && + ((*(*s_etat_processus).s_liste_variables [(*s_etat_processus).position_variable_courante].objet) - .type != LST) + .type != TBL)) { (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; @@ -457,7 +463,6 @@ instruction_sort(struct_processus *s_eta indice_j = 0; indice_k = (*((struct_tableau *) (*s_objet_liste).objet)) .nombre_elements - ecartement; - terminaison_boucle_2 = d_faux; do @@ -551,12 +556,12 @@ instruction_sort(struct_processus *s_eta if (condition == d_faux) { - swap((void *) (*((struct_tableau *) - (*s_objet_liste).objet)).elements - [indice_i - 1], (void *) - (*((struct_tableau *) (*s_objet_liste) - .objet)).elements[indice_l - 1], - sizeof(struct_objet)); + swap(&((*((struct_tableau *) + (*s_objet_liste).objet)).elements + [indice_i - 1]), + &((*((struct_tableau *) (*s_objet_liste) + .objet)).elements[indice_l - 1]), + sizeof(struct_objet *)); indice_i -= ecartement; @@ -787,10 +792,18 @@ instruction_save(struct_processus *s_eta i--; } - (*s_etat_processus).position_variable_courante = i; + if (presence_variable == d_vrai) + { + (*s_etat_processus).position_variable_courante = i; + } + else + { + (*s_etat_processus).position_variable_courante = 0; + } - if ((*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].niveau == 1) + if (((*s_etat_processus).s_liste_variables[(*s_etat_processus) + .position_variable_courante].niveau == 1) && + (presence_variable == d_vrai)) { // On a trouvé une variable globale correspondant au nom et // que l'on modifie. @@ -964,6 +977,12 @@ instruction_suspend(struct_processus *s_ return; } + if (sigdelset(&masque, SIGFABORT) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + if (sigdelset(&masque, SIGURG) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -986,15 +1005,27 @@ instruction_suspend(struct_processus *s_ } } +# ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } +# else + if (sem_post((*s_etat_processus).semaphore_fork) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } +# endif sigsuspend(&masque); +# ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { if (errno != EINTR) { @@ -1359,17 +1390,29 @@ instruction_swi(struct_processus *s_etat attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; +# ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } +# else + if (sem_post((*s_etat_processus).semaphore_fork) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } +# endif 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)) == -1) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { if (errno != EINTR) { @@ -1400,14 +1443,22 @@ instruction_swi(struct_processus *s_etat 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)) == -1) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { if (errno != EINTR) { @@ -1423,17 +1474,29 @@ instruction_swi(struct_processus *s_etat attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; +# ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } +# else + if (sem_post((*s_etat_processus).semaphore_fork) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } +# endif 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)) == -1) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { if (errno != EINTR) { @@ -1464,14 +1527,26 @@ instruction_swi(struct_processus *s_etat nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); +# ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } +# else + if (sem_post((*s_etat_processus).semaphore_fork) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } +# endif } +# ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { if (errno != EINTR) { @@ -1486,18 +1561,30 @@ instruction_swi(struct_processus *s_etat attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; +# ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } +# else + if (sem_post((*s_etat_processus).semaphore_fork) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } +# endif while((longueur_ecriture = write_atomic(s_etat_processus, (*s_etat_processus).pipe_interruptions, &interruption_reduite, sizeof(interruption_reduite))) != sizeof(interruption_reduite)) { +# ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { if (errno != EINTR) { @@ -1528,14 +1615,26 @@ instruction_swi(struct_processus *s_etat nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); +# ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } +# else + if (sem_post((*s_etat_processus).semaphore_fork) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } +# endif } +# ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { if (errno != EINTR) { @@ -1551,18 +1650,29 @@ instruction_swi(struct_processus *s_etat attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; +# ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } +# else + if (sem_post((*s_etat_processus).semaphore_fork) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } +# endif while((longueur_ecriture = write_atomic(s_etat_processus, (*s_etat_processus).pipe_nombre_interruptions_attente, &pid, sizeof(pid))) != sizeof(pid)) { - while(sem_wait(&((*s_etat_processus).semaphore_fork)) - == -1) +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1590,11 +1700,19 @@ instruction_swi(struct_processus *s_etat nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); +# ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } +# else + if (sem_post((*s_etat_processus).semaphore_fork) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } +# endif } pid = getpid(); @@ -1606,7 +1724,11 @@ instruction_swi(struct_processus *s_etat (*s_etat_processus).pipe_nombre_interruptions_attente, &pid, sizeof(pid))) != sizeof(pid)) { +# ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { if (errno != EINTR) { @@ -1637,14 +1759,26 @@ instruction_swi(struct_processus *s_etat nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); +# ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } +# else + if (sem_post((*s_etat_processus).semaphore_fork) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } +# endif } +# ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { if (errno != EINTR) { @@ -1657,17 +1791,29 @@ instruction_swi(struct_processus *s_etat { tid = -3; +# ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } +# else + if (sem_post((*s_etat_processus).semaphore_fork) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } +# endif 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)) == -1) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { if (errno != EINTR) { @@ -1698,11 +1844,19 @@ instruction_swi(struct_processus *s_etat nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); +# ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } +# else + if (sem_post((*s_etat_processus).semaphore_fork) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } +# endif } tid = pthread_self(); @@ -1714,7 +1868,11 @@ instruction_swi(struct_processus *s_etat (*s_etat_processus).pipe_nombre_interruptions_attente, &tid, sizeof(tid))) != sizeof(tid)) { +# ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { if (errno != EINTR) { @@ -1746,14 +1904,26 @@ instruction_swi(struct_processus *s_etat nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); +# ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } +# else + if (sem_post((*s_etat_processus).semaphore_fork) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } +# endif } +# ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { if (errno != EINTR) { @@ -1766,17 +1936,29 @@ instruction_swi(struct_processus *s_etat attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; +# ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } +# else + if (sem_post((*s_etat_processus).semaphore_fork) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } +# endif while(read_atomic(s_etat_processus, (*s_etat_processus).pipe_acquittement, &tampon, sizeof(unsigned char)) != sizeof(unsigned char)) { +# ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { if (errno != EINTR) { @@ -1788,14 +1970,22 @@ instruction_swi(struct_processus *s_etat 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)) == -1) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) == -1) +# endif { if (errno != EINTR) {