--- rpl/src/gestion_variables.c 2013/02/27 17:11:40 1.69 +++ rpl/src/gestion_variables.c 2013/03/23 16:14:39 1.72 @@ -284,7 +284,8 @@ allocation_tableau_noeuds(struct_process } else { - objet = malloc((*s_etat_processus).nombre_caracteres_variables + objet = malloc(((size_t) (*s_etat_processus) + .nombre_caracteres_variables) * sizeof(struct_arbre_variables *)); } @@ -988,7 +989,7 @@ recherche_variable(struct_processus *s_e unsigned char *ptr; - unsigned long niveau_appel; + integer8 niveau_appel; if ((*s_etat_processus).s_arbre_variables == NULL) { @@ -1203,7 +1204,7 @@ retrait_variable(struct_processus *s_eta struct_liste_variables *variable_a_supprimer; struct_liste_variables *variables_par_niveau; - unsigned long niveau; + integer8 niveau; (*s_etat_processus).niveau_supprime = d_faux; @@ -1789,12 +1790,12 @@ liberation_arbre_variables(struct_proces ================================================================================ */ -static int +static integer8 nombre_variables_locales(struct_processus *s_etat_processus, struct_arbre_variables *l_element_courant) { - int i; - int n; + integer8 i; + integer8 n; struct_liste_variables *l_variable; struct_liste_variables_statiques *l_variable_statique; @@ -1848,12 +1849,12 @@ nombre_variables_locales(struct_processu } -static int +static integer8 nombre_variables_partagees(struct_processus *s_etat_processus, struct_arbre_variables_partagees *l_element_courant) { - int i; - int n; + integer8 i; + integer8 n; struct_liste_variables_partagees *l_variable; @@ -1894,7 +1895,7 @@ nombre_variables_partagees(struct_proces } -int +integer8 nombre_variables(struct_processus *s_etat_processus) { return(nombre_variables_locales(s_etat_processus, @@ -1940,19 +1941,19 @@ liberation_mutexes_arbre_variables_parta } -static int +static integer8 liste_variables_locales(struct_processus *s_etat_processus, - struct_tableau_variables *tableau, int position, + struct_tableau_variables *tableau, integer8 position, struct_arbre_variables *l_element_courant) { - int i; + integer8 i; struct_liste_variables *l_variable; struct_liste_variables_statiques *l_variable_statique; if (l_element_courant == NULL) { - return(0); + return(position); } if ((*l_element_courant).feuille != NULL) @@ -1972,8 +1973,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); } @@ -1990,8 +1993,8 @@ 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; @@ -2018,20 +2021,22 @@ liste_variables_locales(struct_processus } -static int +static integer8 liste_variables_partagees(struct_processus *s_etat_processus, - struct_tableau_variables *tableau, int position, + struct_tableau_variables *tableau, integer8 position, struct_arbre_variables_partagees *l_element_courant) { - int i; + integer8 i; struct_liste_variables_partagees *l_variable; 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; @@ -2047,6 +2052,7 @@ liste_variables_partagees(struct_process (*(*l_variable).variable).variable_partagee; tableau[position].variable_partagee.pointeur = NULL; tableau[position].variable_masquee = d_faux; + tableau[position].mutex = &((*(*l_variable).variable).mutex); position++; @@ -2063,6 +2069,12 @@ liste_variables_partagees(struct_process } } + if (pthread_mutex_unlock(&((*l_element_courant).mutex_feuille)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return(0); + } + return(position); } @@ -2086,24 +2098,24 @@ fonction_ordre_variables(const void *arg } else { - return((*a1).niveau - (*a2).niveau); + return(((((*a1).niveau - (*a2).niveau)) > 0) ? 1 : -1); } } -int +integer8 liste_variables(struct_processus *s_etat_processus, struct_tableau_variables *tableau) { - int nombre_elements; + integer8 nombre_elements; 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)); - qsort(tableau, nombre_elements, sizeof(struct_tableau_variables), + qsort(tableau, (size_t) nombre_elements, sizeof(struct_tableau_variables), fonction_ordre_variables); return(nombre_elements); @@ -2456,7 +2468,7 @@ initialisation_variables(struct_processu } if (((*s_etat_processus).pointeurs_caracteres_variables = - malloc(longueur_tableau * sizeof(int))) == NULL) + malloc(((size_t) longueur_tableau) * sizeof(int))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return;