--- rpl/src/gestion_variables.c 2013/06/21 14:15:52 1.79 +++ rpl/src/gestion_variables.c 2015/10/22 18:37:09 1.95 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.15 - Copyright (C) 1989-2013 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.23 + Copyright (C) 1989-2015 Dr. BERTRAND Joël This file is part of RPL/2. @@ -1858,6 +1858,57 @@ nombre_variables_locales(struct_processu } +static void +reinitialisation_recursive_mutexes_variables_partagees( + struct_processus *s_etat_processus, + struct_arbre_variables_partagees *l_element_courant) +{ + integer8 i; + + struct_liste_variables_partagees *l_variable; + + if (l_element_courant == NULL) + { + return; + } + + pthread_mutex_destroy(&((*l_element_courant).mutex_feuille)); + INITIALISATION_MUTEX((*l_element_courant).mutex_feuille); + + if ((*l_element_courant).feuille != NULL) + { + l_variable = (*l_element_courant).feuille; + + do + { + pthread_mutex_destroy(&((*(*l_variable).variable).mutex)); + INITIALISATION_MUTEX((*(*l_variable).variable).mutex); + l_variable = (*l_variable).suivant; + } while(l_variable != NULL); + } + + for(i = 0; i < (*s_etat_processus).nombre_caracteres_variables; i++) + { + if ((*l_element_courant).noeuds[i] != NULL) + { + reinitialisation_recursive_mutexes_variables_partagees( + s_etat_processus, (*l_element_courant).noeuds[i]); + } + } + + return; +} + + +void +reinitialisation_mutexes_variables_partagees(struct_processus *s_etat_processus) +{ + reinitialisation_recursive_mutexes_variables_partagees(s_etat_processus, + (*(*s_etat_processus).s_arbre_variables_partagees)); + return; +} + + static integer8 nombre_variables_partagees(struct_processus *s_etat_processus, struct_arbre_variables_partagees *l_element_courant) @@ -2010,6 +2061,7 @@ liste_variables_locales(struct_processus (*(*l_variable_statique).variable).variable_statique; tableau[position].variable_partagee.pointeur = NULL; tableau[position].variable_masquee = d_vrai; + tableau[position].mutex = NULL; position++; } @@ -2235,14 +2287,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) @@ -2410,8 +2467,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; @@ -2448,7 +2505,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