--- rpl/src/gestion_variables.c 2013/03/22 15:31:19 1.71 +++ rpl/src/gestion_variables.c 2024/01/17 16:57:10 1.113 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.13 - Copyright (C) 1989-2013 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.36 + Copyright (C) 1989-2024 Dr. BERTRAND Joël This file is part of RPL/2. @@ -1531,6 +1531,15 @@ retrait_variables_par_niveau(struct_proc break; } + if (((*s_etat_processus).at_exit != NULL) && + ((*s_etat_processus).niveau_courant == 0)) + { + // Il y a une routine ATEXIT enregistrée. On ne détruit pas + // les variables globales qui pourraient y être utilisées. + + break; + } + while((*(*s_etat_processus).l_liste_variables_par_niveau).liste != NULL) { @@ -1863,6 +1872,7 @@ nombre_variables_partagees(struct_proces return(0); } + // Mutex deverrouillé par liste_variables_partagees(); if (pthread_mutex_lock(&((*l_element_courant).mutex_feuille)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -1953,7 +1963,7 @@ liste_variables_locales(struct_processus if (l_element_courant == NULL) { - return(0); + return(position); } if ((*l_element_courant).feuille != NULL) @@ -1973,8 +1983,10 @@ liste_variables_locales(struct_processus tableau[position].variable_partagee = (*(*l_variable).variable).variable_partagee; tableau[position].variable_masquee = d_faux; + tableau[position].mutex = NULL; position++; + l_variable = (*l_variable).suivant; } while(l_variable != (*l_element_courant).feuille); } @@ -1991,13 +2003,14 @@ liste_variables_locales(struct_processus tableau[position].nom = (*(*l_variable_statique).variable).nom; tableau[position].niveau = (*(*l_variable_statique).variable).niveau; - tableau[position].objet = - (*(*l_variable_statique).variable).objet; + tableau[position].objet = (*(*l_variable_statique).variable) + .objet; tableau[position].variable_verrouillee = d_faux; tableau[position].variable_statique = (*(*l_variable_statique).variable).variable_statique; tableau[position].variable_partagee.pointeur = NULL; tableau[position].variable_masquee = d_vrai; + tableau[position].mutex = NULL; position++; } @@ -2030,11 +2043,9 @@ liste_variables_partagees(struct_process if (l_element_courant == NULL) { - return(0); + return(position); } - // mutex_liste_variables_partagees - // et (*l_variable_courante).mutex_feuille if ((*l_element_courant).feuille != NULL) { l_variable = (*l_element_courant).feuille; @@ -2048,8 +2059,10 @@ liste_variables_partagees(struct_process tableau[position].variable_verrouillee = d_faux; tableau[position].variable_partagee = (*(*l_variable).variable).variable_partagee; - tableau[position].variable_partagee.pointeur = NULL; + tableau[position].variable_statique.pointeur = NULL; tableau[position].variable_masquee = d_faux; + tableau[position].mutex = &((*(*l_variable).variable).mutex); + pthread_mutex_lock(tableau[position].mutex); position++; @@ -2066,6 +2079,13 @@ liste_variables_partagees(struct_process } } + // Mutex verrouillé par nombre_variables_partagees(); + if (pthread_mutex_unlock(&((*l_element_courant).mutex_feuille)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return(0); + } + return(position); } @@ -2102,7 +2122,7 @@ liste_variables(struct_processus *s_etat nombre_elements = liste_variables_locales(s_etat_processus, tableau, 0, (*s_etat_processus).s_arbre_variables); - nombre_elements += liste_variables_partagees(s_etat_processus, + nombre_elements = liste_variables_partagees(s_etat_processus, tableau, nombre_elements, (*(*s_etat_processus) .s_arbre_variables_partagees)); @@ -2216,14 +2236,19 @@ copie_arbre_variables(struct_processus * s_variable = (*((struct_variable *) (*l_element_courant).donnee)); - if ((s_variable.nom = strdup((*((struct_variable *) - (*l_element_courant).donnee)).nom)) == NULL) + if ((s_variable.nom = rpl_malloc(s_nouvel_etat_processus, + (strlen((*((struct_variable *) + (*l_element_courant).donnee)).nom) + 1) * + sizeof(unsigned char))) == NULL) { (*s_nouvel_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } + strcpy(s_variable.nom, (*((struct_variable *) + (*l_element_courant).donnee)).nom); + if ((s_variable.objet = copie_objet(s_nouvel_etat_processus, (*((struct_variable *) (*l_element_courant).donnee)) .objet, 'P')) == NULL) @@ -2391,8 +2416,8 @@ copie_arbre_variables(struct_processus * return; } - if ((s_variable_statique.nom = malloc((strlen( - (*(*l_element_statique_courant).variable).nom) + 1) * + if ((s_variable_statique.nom = rpl_malloc(s_nouvel_etat_processus, + (strlen((*(*l_element_statique_courant).variable).nom) + 1) * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -2429,7 +2454,7 @@ copie_arbre_variables(struct_processus * */ /* - * Caractères autorisés dans les instructions + * Caractères autorisés dans les variables * * A B C D E F G H I J K L M N O P Q R S T U V W X Y Z * a b c d e f g h i j k l m n o p q r s t u v w x y z