--- rpl/src/gestion_variables_statiques.c 2012/10/07 08:18:35 1.38 +++ rpl/src/gestion_variables_statiques.c 2012/12/13 16:59:41 1.42 @@ -103,7 +103,6 @@ creation_variable_statique(struct_proces // Ajout de la variable en tête de la liste des variables statiques -printf("<0>\n"); if ((l_nouvel_element = malloc(sizeof(struct_liste_variables_statiques))) == NULL) { @@ -119,6 +118,7 @@ printf("<0>\n"); } (*(*l_nouvel_element).variable) = (*s_variable); + (*l_nouvel_element).suivant = (*s_etat_processus) .l_liste_variables_statiques; (*l_nouvel_element).precedent = NULL; @@ -144,9 +144,12 @@ printf("<0>\n"); (*(*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) @@ -196,7 +199,13 @@ printf("<0>\n"); .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 @@ -289,12 +298,10 @@ retrait_variable_statique(struct_process logical1 erreur; -printf("<1>\n"); if ((l_element_a_supprimer = recherche_variable_statique(s_etat_processus, nom_variable, position, ((*s_etat_processus) .mode_execution_programme == 'Y') ? 'P' : 'E')) != NULL) { -printf("<2>\n"); // (*s_etat_processus).pointeur_variable_statique_courante // pointe sur la variable à éliminer. Cette variable est celle qui // est présente dans l'une des feuilles statiques de l'arbre des @@ -306,11 +313,22 @@ printf("<2>\n"); if ((*l_element_liste_a_supprimer).precedent != NULL) { + // L'élément à supprimer n'est pas le premier de la liste. + (*(*l_element_liste_a_supprimer).precedent).suivant = (*l_element_liste_a_supprimer).suivant; + + if ((*l_element_liste_a_supprimer).suivant != NULL) + { + // Il y a un élément suivant. On le chaîne. + (*(*l_element_liste_a_supprimer).suivant).precedent = NULL; + } } else { + // L'élement est le premier de la liste. S'il y a un élément + // suivant, on le chaîne. + if ((*l_element_liste_a_supprimer).suivant != NULL) { (*(*l_element_liste_a_supprimer).suivant).precedent = NULL; @@ -320,16 +338,6 @@ printf("<2>\n"); (*l_element_liste_a_supprimer).suivant; } - if ((*l_element_liste_a_supprimer).suivant != NULL) - { - (*(*l_element_liste_a_supprimer).suivant).precedent = - (*l_element_liste_a_supprimer).precedent; - } - else - { - (*(*l_element_liste_a_supprimer).precedent).suivant = NULL; - } - free(l_element_liste_a_supprimer); // Suppression depuis la feuille statique. Le champ 'precedent' ne sert @@ -337,26 +345,34 @@ printf("<2>\n"); if ((*l_element_a_supprimer).precedent != NULL) { + // L'élément n'est pas le premier de la liste. + (*(*l_element_a_supprimer).precedent).suivant = (*l_element_a_supprimer).suivant; + + if ((*l_element_a_supprimer).suivant != NULL) + { + (*(*l_element_a_supprimer).suivant).precedent = + (*l_element_a_supprimer).precedent; + } + else + { + (*(*l_element_a_supprimer).precedent).suivant = NULL; + } } else { - (*(*l_element_a_supprimer).suivant).precedent = NULL; + // L'élément est le premier de la liste. + + if ((*l_element_a_supprimer).suivant != NULL) + { + (*(*l_element_a_supprimer).suivant).precedent = NULL; + } + (*(*l_element_a_supprimer).feuille).feuille_statique = (*l_element_a_supprimer).suivant; } - if ((*l_element_a_supprimer).suivant != NULL) - { - (*(*l_element_a_supprimer).suivant).precedent = - (*l_element_a_supprimer).precedent; - } - else - { - (*(*l_element_a_supprimer).precedent).suivant = NULL; - } - liberation(s_etat_processus, (*(*l_element_a_supprimer).variable) .objet); free((*(*l_element_a_supprimer).variable).nom);