--- rpl/src/gestion_objets.c 2012/04/13 14:12:49 1.81 +++ rpl/src/gestion_objets.c 2012/12/18 13:19:35 1.92 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.8 + RPL/2 (R) version 4.1.12 Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -112,9 +112,11 @@ initialisation_allocateur(struct_process (*s_etat_processus).pointeur_maillons = 0; (*s_etat_processus).pointeur_variables_noeud = 0; + (*s_etat_processus).pointeur_variables_partagees_noeud = 0; (*s_etat_processus).pointeur_variables_feuille = 0; (*s_etat_processus).pointeur_variables_variable = 0; (*s_etat_processus).pointeur_variables_tableau_noeuds = 0; + (*s_etat_processus).pointeur_variables_tableau_noeuds_partages = 0; return; } @@ -150,12 +152,17 @@ liberation_allocateur(struct_processus * for(i = 0; i < (*s_etat_processus).pointeur_variables_noeud; free((*s_etat_processus).variables_noeud[i++])); + for(i = 0; i < (*s_etat_processus).pointeur_variables_partagees_noeud; + free((*s_etat_processus).variables_partagees_noeud[i++])); for(i = 0; i < (*s_etat_processus).pointeur_variables_feuille; free((*s_etat_processus).variables_feuille[i++])); for(i = 0; i < (*s_etat_processus).pointeur_variables_variable; free((*s_etat_processus).variables_variable[i++])); for(i = 0; i < (*s_etat_processus).pointeur_variables_tableau_noeuds; free((*s_etat_processus).variables_tableau_noeuds[i++])); + for(i = 0; i < (*s_etat_processus) + .pointeur_variables_tableau_noeuds_partages; + free((*s_etat_processus).variables_tableau_noeuds_partages[i++])); { struct_liste_chainee *l_element_courant; @@ -2283,12 +2290,17 @@ copie_objet(struct_processus *s_etat_pro return(s_objet); } + // Un objet de type NON est un objet encapsulé dans une + // structure de type struct_objet. Elle peut très bien contenir + // une donnée, mais c'est à l'utilisateur de la libérer + // explicitement avec un free(). + if ((s_nouvel_objet = allocation(s_etat_processus, NON)) == NULL) { return(NULL); } - (*s_nouvel_objet).objet = NULL; + (*s_nouvel_objet).objet = (*s_objet).objet; break; } @@ -2817,6 +2829,7 @@ copie_etat_processus(struct_processus *s pthread_mutexattr_init(&attributs_mutex); pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL); + (*s_nouvel_etat_processus).sections_critiques = 0; // Les sémaphores sont initialisés dans le nouveau thread. Il // s'agit d'une limitation de l'implantation de l'émulation @@ -3106,6 +3119,7 @@ copie_etat_processus(struct_processus *s * Copie de la table des variables */ + (*s_nouvel_etat_processus).l_liste_variables_statiques = NULL; copie_arbre_variables(s_etat_processus, s_nouvel_etat_processus); if ((*s_nouvel_etat_processus).erreur_systeme != d_es) @@ -3113,65 +3127,10 @@ copie_etat_processus(struct_processus *s return(NULL); } - /* - * Copie de la table des variables statiques - */ - - if (((*s_nouvel_etat_processus).s_liste_variables_statiques = - malloc((*s_etat_processus).nombre_variables_statiques_allouees * - sizeof(struct_variable_statique))) == NULL) - { - if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return(NULL); - } - - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return(NULL); - } - - for(i = 0; i < (*s_etat_processus).nombre_variables_statiques; i++) - { - if (((*s_nouvel_etat_processus).s_liste_variables_statiques[i].nom = - malloc((strlen((*s_etat_processus).s_liste_variables_statiques - [i].nom) + 1) * sizeof(unsigned char))) == NULL) - { - if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return(NULL); - } - - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return(NULL); - } - - strcpy((*s_nouvel_etat_processus).s_liste_variables_statiques[i].nom, - (*s_etat_processus).s_liste_variables_statiques[i].nom); - - (*s_nouvel_etat_processus).s_liste_variables_statiques[i].origine = - (*s_etat_processus).s_liste_variables_statiques[i].origine; - (*s_nouvel_etat_processus).s_liste_variables_statiques[i].niveau = - (*s_etat_processus).s_liste_variables_statiques[i].niveau; - (*s_nouvel_etat_processus).s_liste_variables_statiques[i] - .variable_statique = (*s_etat_processus) - .s_liste_variables_statiques[i].variable_statique; - - if (((*s_nouvel_etat_processus).s_liste_variables_statiques[i].objet = - copie_objet(s_etat_processus, (*s_etat_processus) - .s_liste_variables_statiques[i].objet, 'P')) == NULL) - { - if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return(NULL); - } - - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return(NULL); - } - } + (*(*s_nouvel_etat_processus).l_liste_variables_partagees) = + (*(*s_etat_processus).l_liste_variables_partagees); + (*(*s_nouvel_etat_processus).s_arbre_variables_partagees) = + (*(*s_etat_processus).s_arbre_variables_partagees); /* * Copie de la pile opérationnelle