version 1.19.2.3, 2011/05/09 13:52:24
|
version 1.65, 2015/02/19 11:01:29
|
Line 1
|
Line 1
|
/* |
/* |
================================================================================ |
================================================================================ |
RPL/2 (R) version 4.0.24 |
RPL/2 (R) version 4.1.21 |
Copyright (C) 1989-2011 Dr. BERTRAND Joël |
Copyright (C) 1989-2015 Dr. BERTRAND Joël |
|
|
This file is part of RPL/2. |
This file is part of RPL/2. |
|
|
Line 25
|
Line 25
|
|
|
/* |
/* |
================================================================================ |
================================================================================ |
Boucle principale optimisé de l'interprète RPL/2 |
Boucle principale optimisée de l'interprète RPL/2 |
================================================================================ |
================================================================================ |
Entrées : structure sur l'état du processus |
Entrées : structure sur l'état du processus |
-------------------------------------------------------------------------------- |
-------------------------------------------------------------------------------- |
Line 38
|
Line 38
|
logical1 |
logical1 |
sequenceur_optimise(struct_processus *s_etat_processus) |
sequenceur_optimise(struct_processus *s_etat_processus) |
{ |
{ |
logical1 erreur; |
integer8 adresse_point_entree; |
|
integer8 i; |
|
integer8 j; |
|
integer8 nb_variables; |
|
integer8 point_entree; |
|
|
long i; |
logical1 erreur; |
long point_entree; |
|
|
|
unsigned char *message; |
struct_objet *programme_principal; |
|
|
unsigned long adresse_point_entree; |
struct_tableau_variables *tableau; |
|
|
|
unsigned char *message; |
|
unsigned char registre; |
|
|
if ((*s_etat_processus).debug == d_vrai) |
if ((*s_etat_processus).debug == d_vrai) |
if (((*s_etat_processus).type_debug & |
if (((*s_etat_processus).type_debug & |
Line 53 sequenceur_optimise(struct_processus *s_
|
Line 59 sequenceur_optimise(struct_processus *s_
|
{ |
{ |
if ((*s_etat_processus).langue == 'F') |
if ((*s_etat_processus).langue == 'F') |
{ |
{ |
printf("+++Optimisation [%d]\n", (int) getpid()); |
printf("+++Compilation [%d]\n", (int) getpid()); |
} |
} |
else |
else |
{ |
{ |
printf("+++Optimization [%d]\n", (int) getpid()); |
printf("+++Compilation [%d]\n", (int) getpid()); |
} |
} |
|
|
printf("\n"); |
printf("\n"); |
Line 66 sequenceur_optimise(struct_processus *s_
|
Line 72 sequenceur_optimise(struct_processus *s_
|
|
|
point_entree = -1; |
point_entree = -1; |
adresse_point_entree = 0; |
adresse_point_entree = 0; |
|
programme_principal = NULL; |
|
|
empilement_pile_systeme(s_etat_processus); |
empilement_pile_systeme(s_etat_processus); |
(*(*s_etat_processus).l_base_pile_systeme).retour_definition = 'Y'; |
(*(*s_etat_processus).l_base_pile_systeme).retour_definition = 'Y'; |
(*s_etat_processus).autorisation_empilement_programme = 'Y'; |
(*s_etat_processus).autorisation_empilement_programme = 'Y'; |
(*s_etat_processus).mode_execution_programme = 'N'; |
(*s_etat_processus).mode_execution_programme = 'N'; |
|
|
for(i = 0; i < (long) (*s_etat_processus).nombre_variables; i++) |
nb_variables = nombre_variables(s_etat_processus); |
|
|
|
if ((tableau = malloc(((size_t) nb_variables) * |
|
sizeof(struct_tableau_variables))) == NULL) |
{ |
{ |
if ((*s_etat_processus).s_liste_variables[i].niveau == 0) |
if ((*s_etat_processus).langue == 'F') |
|
{ |
|
printf("+++Système : Mémoire insuffisante\n"); |
|
} |
|
else |
|
{ |
|
printf("+++System : Not enough memory\n"); |
|
} |
|
|
|
liberation_mutexes_arbre_variables_partagees(s_etat_processus, |
|
(*(*s_etat_processus).s_arbre_variables_partagees)); |
|
return(d_erreur); |
|
} |
|
|
|
nb_variables = liste_variables(s_etat_processus, tableau); |
|
|
|
for(i = 0; i < nb_variables; i++) |
|
{ |
|
if (tableau[i].niveau == 0) |
{ |
{ |
// Variables qui contiennent les points d'entrée des définitions. |
// Variables qui contiennent les points d'entrée des définitions. |
|
|
(*s_etat_processus).position_courante = (*((unsigned long *) |
(*s_etat_processus).position_courante = (*((integer8 *) |
(*((*s_etat_processus).s_liste_variables[i].objet)).objet)); |
(*(tableau[i].objet)).objet)); |
|
|
if (point_entree == -1) |
if (point_entree == -1) |
{ |
{ |
Line 102 sequenceur_optimise(struct_processus *s_
|
Line 130 sequenceur_optimise(struct_processus *s_
|
{ |
{ |
if ((*s_etat_processus).langue == 'F') |
if ((*s_etat_processus).langue == 'F') |
{ |
{ |
printf("+++Fatal : Optimisation impossible\n"); |
printf("+++Fatal : Compilation impossible\n"); |
} |
} |
else |
else |
{ |
{ |
printf("+++Fatal : Optimization failed\n"); |
printf("+++Fatal : Compilation failed\n"); |
|
} |
|
|
|
for(j = 0; j < nb_variables; j++) |
|
{ |
|
if (tableau[j].mutex != NULL) |
|
{ |
|
pthread_mutex_unlock(tableau[j].mutex); |
|
} |
} |
} |
|
|
|
free(tableau); |
return(d_erreur); |
return(d_erreur); |
} |
} |
|
|
|
// Il faut désactiver la vérification des variables |
|
// implicites car aucune variable de niveau strictement |
|
// positif étant créée, la fonction recherche_type() pourrait |
|
// échouer. |
|
|
|
registre = (*s_etat_processus).autorisation_nom_implicite; |
|
(*s_etat_processus).autorisation_nom_implicite = 'Y'; |
|
(*s_etat_processus).type_en_cours = NON; |
recherche_type(s_etat_processus); |
recherche_type(s_etat_processus); |
|
(*s_etat_processus).autorisation_nom_implicite = registre; |
|
|
if (((*s_etat_processus).erreur_execution != d_ex) || |
if (((*s_etat_processus).erreur_execution != d_ex) || |
((*s_etat_processus).erreur_systeme != d_es)) |
((*s_etat_processus).erreur_systeme != d_es)) |
{ |
{ |
|
if ((*s_etat_processus).core == d_vrai) |
|
{ |
|
if ((*s_etat_processus).langue == 'F') |
|
{ |
|
printf("+++Information : " |
|
"Génération du fichier rpl-core " |
|
"[%d]\n", (int) getpid()); |
|
} |
|
else |
|
{ |
|
printf("+++Information : " |
|
"Writing rpl-core file [%d]\n", |
|
(int) getpid()); |
|
} |
|
|
|
rplcore(s_etat_processus); |
|
|
|
if ((*s_etat_processus).langue == 'F') |
|
{ |
|
printf("+++Information : " |
|
"Processus tracé [%d]\n", |
|
(int) getpid()); |
|
} |
|
else |
|
{ |
|
printf("+++Information : Done [%d]\n", |
|
(int) getpid()); |
|
} |
|
|
|
fflush(stdout); |
|
} |
|
|
|
if ((*s_etat_processus).langue == 'F') |
|
{ |
|
printf("+++Fatal : Compilation impossible\n"); |
|
} |
|
else |
|
{ |
|
printf("+++Fatal : Compilation failed\n"); |
|
} |
|
|
|
for(j = 0; j < nb_variables; j++) |
|
{ |
|
if (tableau[j].mutex != NULL) |
|
{ |
|
pthread_mutex_unlock(tableau[j].mutex); |
|
} |
|
} |
|
|
|
free(tableau); |
|
return(d_erreur); |
|
} |
|
|
|
// Modification de la variable. Il n'existe à cet instant |
|
// que des variables de niveau 0. |
|
|
|
if (recherche_variable(s_etat_processus, tableau[i].nom) == |
|
d_faux) |
|
{ |
if ((*s_etat_processus).langue == 'F') |
if ((*s_etat_processus).langue == 'F') |
{ |
{ |
printf("+++Fatal : Optimisation impossible\n"); |
printf("+++Fatal : Compilation impossible\n"); |
} |
} |
else |
else |
{ |
{ |
printf("+++Fatal : Optimization failed\n"); |
printf("+++Fatal : Compilation failed\n"); |
} |
} |
|
|
|
for(j = 0; j < nb_variables; j++) |
|
{ |
|
if (tableau[j].mutex != NULL) |
|
{ |
|
pthread_mutex_unlock(tableau[j].mutex); |
|
} |
|
} |
|
|
|
free(tableau); |
return(d_erreur); |
return(d_erreur); |
} |
} |
|
|
liberation(s_etat_processus, |
liberation(s_etat_processus, tableau[i].objet); |
(*s_etat_processus).s_liste_variables[i].objet); |
|
|
|
if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), |
if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), |
&((*s_etat_processus).s_liste_variables[i].objet)) |
&((*(*s_etat_processus).pointeur_variable_courante).objet)) |
== d_erreur) |
== d_erreur) |
{ |
{ |
if ((*s_etat_processus).langue == 'F') |
if ((*s_etat_processus).langue == 'F') |
{ |
{ |
printf("+++Fatal : Optimisation impossible\n"); |
printf("+++Fatal : Compilation impossible\n"); |
} |
} |
else |
else |
{ |
{ |
printf("+++Fatal : Optimization failed\n"); |
printf("+++Fatal : Compilation failed\n"); |
} |
} |
|
|
|
for(j = 0; j < nb_variables; j++) |
|
{ |
|
if (tableau[j].mutex != NULL) |
|
{ |
|
pthread_mutex_unlock(tableau[j].mutex); |
|
} |
|
} |
|
|
|
free(tableau); |
return(d_erreur); |
return(d_erreur); |
} |
} |
|
|
(*s_etat_processus).s_liste_variables[i].origine = 'E'; |
(*(*s_etat_processus).pointeur_variable_courante).origine = 'E'; |
free((*s_etat_processus).instruction_courante); |
free((*s_etat_processus).instruction_courante); |
|
|
|
if (point_entree == i) |
|
{ |
|
programme_principal = (*(*s_etat_processus) |
|
.pointeur_variable_courante).objet; |
|
} |
} |
} |
} |
} |
|
|
Line 157 sequenceur_optimise(struct_processus *s_
|
Line 285 sequenceur_optimise(struct_processus *s_
|
{ |
{ |
if ((*s_etat_processus).langue == 'F') |
if ((*s_etat_processus).langue == 'F') |
{ |
{ |
printf("+++Fatal : Optimisation impossible\n"); |
printf("+++Fatal : Compilation impossible\n"); |
} |
} |
else |
else |
{ |
{ |
printf("+++Fatal : Optimization failed\n"); |
printf("+++Fatal : Compilation failed\n"); |
|
} |
|
|
|
for(j = 0; j < nb_variables; j++) |
|
{ |
|
if (tableau[j].mutex != NULL) |
|
{ |
|
pthread_mutex_unlock(tableau[j].mutex); |
|
} |
} |
} |
|
|
|
free(tableau); |
return(d_erreur); |
return(d_erreur); |
} |
} |
|
|
Line 176 sequenceur_optimise(struct_processus *s_
|
Line 313 sequenceur_optimise(struct_processus *s_
|
|
|
if ((*s_etat_processus).langue == 'F') |
if ((*s_etat_processus).langue == 'F') |
{ |
{ |
printf("[%d] Optimisation achevée\n", (int) getpid()); |
printf("[%d] Compilation achevée\n", (int) getpid()); |
} |
} |
else |
else |
{ |
{ |
printf("[%d] Optimization done\n", (int) getpid()); |
printf("[%d] Compilation done\n", (int) getpid()); |
} |
} |
|
|
printf("\n"); |
printf("\n"); |
Line 197 sequenceur_optimise(struct_processus *s_
|
Line 334 sequenceur_optimise(struct_processus *s_
|
{ |
{ |
if ((*s_etat_processus).langue == 'F') |
if ((*s_etat_processus).langue == 'F') |
{ |
{ |
printf("+++Fatal : Optimisation impossible\n"); |
printf("+++Fatal : Compilation impossible\n"); |
} |
} |
else |
else |
{ |
{ |
printf("+++Fatal : Optimization failed\n"); |
printf("+++Fatal : Compilation failed\n"); |
} |
} |
|
|
|
for(j = 0; j < nb_variables; j++) |
|
{ |
|
if (tableau[j].mutex != NULL) |
|
{ |
|
pthread_mutex_unlock(tableau[j].mutex); |
|
} |
|
} |
|
|
|
free(tableau); |
return(d_erreur); |
return(d_erreur); |
} |
} |
|
|
Line 213 sequenceur_optimise(struct_processus *s_
|
Line 359 sequenceur_optimise(struct_processus *s_
|
|
|
if ((*s_etat_processus).profilage == d_vrai) |
if ((*s_etat_processus).profilage == d_vrai) |
{ |
{ |
profilage(s_etat_processus, (*s_etat_processus).s_liste_variables |
profilage(s_etat_processus, tableau[point_entree].nom); |
[point_entree].nom); |
|
} |
} |
|
|
if ((*s_etat_processus).erreur_systeme != d_es) |
if ((*s_etat_processus).erreur_systeme != d_es) |
Line 228 sequenceur_optimise(struct_processus *s_
|
Line 373 sequenceur_optimise(struct_processus *s_
|
printf("+++System : Not enough memory\n"); |
printf("+++System : Not enough memory\n"); |
} |
} |
|
|
|
for(j = 0; j < nb_variables; j++) |
|
{ |
|
if (tableau[j].mutex != NULL) |
|
{ |
|
pthread_mutex_unlock(tableau[j].mutex); |
|
} |
|
} |
|
|
|
free(tableau); |
return(d_erreur); |
return(d_erreur); |
} |
} |
|
|
erreur = evaluation(s_etat_processus, (*s_etat_processus).s_liste_variables |
for(j = 0; j < nb_variables; j++) |
[point_entree].objet, 'E'); |
{ |
|
if (tableau[j].mutex != NULL) |
|
{ |
|
pthread_mutex_unlock(tableau[j].mutex); |
|
} |
|
} |
|
|
|
free(tableau); |
|
|
|
erreur = evaluation(s_etat_processus, programme_principal, 'E'); |
|
|
if ((*s_etat_processus).profilage == d_vrai) |
if ((*s_etat_processus).profilage == d_vrai) |
{ |
{ |