--- rpl/src/gestion_variables.c 2012/10/07 08:18:35 1.61 +++ rpl/src/gestion_variables.c 2012/12/13 16:59:41 1.64 @@ -427,9 +427,12 @@ ajout_variable(struct_processus *s_etat_ (*(*s_etat_processus).s_arbre_variables).feuille = NULL; (*(*s_etat_processus).s_arbre_variables).feuille_statique = NULL; + (*(*s_etat_processus).s_arbre_variables).feuille_partagee = NULL; (*(*s_etat_processus).s_arbre_variables).noeuds_utilises = 0; (*(*s_etat_processus).s_arbre_variables).indice_tableau_pere = -1; (*(*s_etat_processus).s_arbre_variables).noeud_pere = NULL; + INITIALISATION_MUTEX((*(*s_etat_processus).s_arbre_variables) + .mutex_feuille_partagee); if (((*(*s_etat_processus).s_arbre_variables).noeuds = allocation_tableau_noeuds(s_etat_processus)) == NULL) @@ -480,7 +483,13 @@ ajout_variable(struct_processus *s_etat_ .pointeurs_caracteres_variables[*ptr]]).feuille_statique = NULL; (*(*l_variable_courante).noeuds[(*s_etat_processus) + .pointeurs_caracteres_variables[*ptr]]).feuille_partagee + = NULL; + (*(*l_variable_courante).noeuds[(*s_etat_processus) .pointeurs_caracteres_variables[*ptr]]).noeuds_utilises = 0; + INITIALISATION_MUTEX((*(*l_variable_courante).noeuds + [(*s_etat_processus).pointeurs_caracteres_variables[*ptr]]) + .mutex_feuille_partagee); // Le champ noeud_pere de la structure créée pointe sur // la structure parente et l'indice tableau_pere correspond à la @@ -1297,7 +1306,8 @@ retrait_variable(struct_processus *s_eta .feuille = NULL; while(((*s_arbre_courant).noeuds_utilises == 0) && - ((*s_arbre_courant).feuille_statique == NULL)) + ((*s_arbre_courant).feuille_statique == NULL) && + ((*s_arbre_courant).feuille_partagee == NULL)) { s_arbre_a_supprimer = s_arbre_courant; s_arbre_courant = (*s_arbre_courant).noeud_pere; @@ -1958,6 +1968,7 @@ copie_arbre_variables(struct_processus * struct_liste_variables_statiques *l_element_statique_courant; struct_variable s_variable; + struct_variable_statique s_variable_statique; unsigned char *ptr; @@ -2181,8 +2192,31 @@ copie_arbre_variables(struct_processus * ptr++; } + // Il faut copier la variable pour la dissocier de la variable + // restant dans le thread parent. + + s_variable_statique = (*(*l_element_statique_courant).variable); + + if (copie_objet(s_etat_processus, s_variable_statique.objet, 'P') + == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + if ((s_variable_statique.nom = malloc((strlen( + (*(*l_element_statique_courant).variable).nom) + 1) * + sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + strcpy(s_variable_statique.nom, (*(*l_element_statique_courant) + .variable).nom); + if (creation_variable_statique(s_nouvel_etat_processus, - (*l_element_statique_courant).variable) == d_erreur) + &s_variable_statique) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return;