--- rpl/src/gestion_objets.c 2011/06/20 17:54:15 1.49 +++ rpl/src/gestion_objets.c 2011/09/14 17:55:59 1.67 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.0.prerelease.1 + RPL/2 (R) version 4.1.3 Copyright (C) 1989-2011 Dr. BERTRAND Joël This file is part of RPL/2. @@ -111,6 +111,11 @@ initialisation_allocateur(struct_process (*s_etat_processus).pointeur_vec = 0; (*s_etat_processus).pointeur_maillons = 0; + (*s_etat_processus).pointeur_variables_noeud = 0; + (*s_etat_processus).pointeur_variables_feuille = 0; + (*s_etat_processus).pointeur_variables_variable = 0; + (*s_etat_processus).pointeur_variables_tableau_noeuds = 0; + return; } @@ -143,6 +148,15 @@ liberation_allocateur(struct_processus * for(i = 0; i < (*s_etat_processus).pointeur_maillons; free((*s_etat_processus).maillons[i++])); + 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_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++])); + { struct_liste_chainee *l_element_courant; struct_liste_chainee *l_element_suivant; @@ -234,7 +248,7 @@ allocation_maillon(struct_processus *s_e /* ================================================================================ - Routine d'allocation d'un maillon d'un objet (liste, expression...) + Routine de libération d'un maillon d'un objet (liste, expression...) ================================================================================ Entrées : structure sur l'état du processus et objet à afficher -------------------------------------------------------------------------------- @@ -274,7 +288,7 @@ liberation_maillon(struct_processus *s_e ================================================================================ */ -void * +struct_objet * allocation(struct_processus *s_etat_processus, enum t_type type) { struct_objet *s_objet; @@ -758,9 +772,6 @@ liberation(struct_processus *s_etat_proc { logical1 drapeau; - sigset_t oldset; - sigset_t set; - struct_liste_chainee *l_element_courant; struct_liste_chainee *l_element_suivant; @@ -1130,15 +1141,9 @@ liberation(struct_processus *s_etat_proc case PRC : { - sigfillset(&set); - pthread_sigmask(SIG_BLOCK, &set, &oldset); - if (pthread_mutex_lock(&((*(*((struct_processus_fils *) (*s_objet).objet)).thread).mutex_nombre_references)) != 0) { - pthread_sigmask(SIG_SETMASK, &oldset, NULL); - sigpending(&set); - (*s_etat_processus).erreur_systeme = d_es_processus; return; } @@ -1166,16 +1171,10 @@ liberation(struct_processus *s_etat_proc if (pthread_mutex_unlock(&((*(*((struct_processus_fils *) (*s_objet).objet)).thread).mutex_nombre_references)) != 0) { - pthread_sigmask(SIG_SETMASK, &oldset, NULL); - sigpending(&set); - (*s_etat_processus).erreur_systeme = d_es_processus; return; } - pthread_sigmask(SIG_SETMASK, &oldset, NULL); - sigpending(&set); - if (drapeau == d_vrai) { pthread_mutex_destroy(&((*(*((struct_processus_fils *) @@ -1513,9 +1512,6 @@ struct_objet * copie_objet(struct_processus *s_etat_processus, struct_objet *s_objet, unsigned char type) { - sigset_t oldset; - sigset_t set; - struct_liste_chainee *l_element_base; struct_liste_chainee *l_element_courant; struct_liste_chainee *l_element_courant_ecriture; @@ -2286,15 +2282,9 @@ copie_objet(struct_processus *s_etat_pro case PRC : { - sigfillset(&set); - pthread_sigmask(SIG_BLOCK, &set, &oldset); - if (pthread_mutex_lock(&((*(*((struct_processus_fils *) (*s_objet).objet)).thread).mutex_nombre_references)) != 0) { - pthread_sigmask(SIG_SETMASK, &oldset, NULL); - sigpending(&set); - return(NULL); } @@ -2304,15 +2294,9 @@ copie_objet(struct_processus *s_etat_pro if (pthread_mutex_unlock(&((*(*((struct_processus_fils *) (*s_objet).objet)).thread).mutex_nombre_references)) != 0) { - pthread_sigmask(SIG_SETMASK, &oldset, NULL); - sigpending(&set); - return(NULL); } - pthread_sigmask(SIG_SETMASK, &oldset, NULL); - sigpending(&set); - if (type != 'O') { incrementation_atomique(s_objet); @@ -2817,16 +2801,14 @@ copie_etat_processus(struct_processus *s * n'ont aucune raison de changer. */ -# ifndef SEMAPHORES_NOMMES - sem_init(&((*s_nouvel_etat_processus).semaphore_fork), 0, 0); -# else - if (((*s_nouvel_etat_processus).semaphore_fork = sem_init2(0, sem_fork)) - == SEM_FAILED) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return(NULL); - } -# endif + pthread_mutexattr_init(&attributs_mutex); + pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL); + pthread_mutex_init(&((*s_nouvel_etat_processus).mutex_fork), + &attributs_mutex); + pthread_mutexattr_destroy(&attributs_mutex); + pthread_mutex_lock(&((*s_nouvel_etat_processus).mutex_fork)); + + initialisation_contexte_cas(s_etat_processus); (*s_nouvel_etat_processus).var_volatile_processus_pere = 0; (*s_nouvel_etat_processus).var_volatile_processus_racine = 0; @@ -2841,6 +2823,8 @@ copie_etat_processus(struct_processus *s (*s_nouvel_etat_processus).processus_detache = d_faux; (*s_nouvel_etat_processus).evaluation_forcee = 'N'; + (*s_nouvel_etat_processus).compteur_violation_d_acces = 0; + (*s_nouvel_etat_processus).nombre_objets_envoyes_non_lus = 0; (*s_nouvel_etat_processus).nombre_objets_injectes = 0; (*s_nouvel_etat_processus).presence_fusible = d_faux; @@ -3110,17 +3094,13 @@ copie_etat_processus(struct_processus *s * Copie de la table des variables */ - if (((*s_nouvel_etat_processus).s_arbre_variables = - copie_arbre_variables(s_etat_processus)) == NULL) + copie_arbre_variables(s_etat_processus, s_nouvel_etat_processus); + + if ((*s_nouvel_etat_processus).erreur_systeme != d_es) { return(NULL); } - // La pile des variables par niveau n'est pas copiée puisqu'il est - // impossible n'enlever dans un thread une variable créée dans le père. - - (*s_etat_processus).l_liste_variables_par_niveau = NULL; - /* * Copie de la table des variables statiques */ @@ -3288,6 +3268,9 @@ copie_etat_processus(struct_processus *s * Copie des différents contextes */ + (*s_nouvel_etat_processus).pointeur_signal_lecture = d_faux; + (*s_nouvel_etat_processus).pointeur_signal_ecriture = d_faux; + (*s_nouvel_etat_processus).l_base_pile_contextes = NULL; l_element_lecture = (*s_etat_processus).l_base_pile_contextes; @@ -3952,22 +3935,10 @@ debug_fork() pthread_mutex_lock(&mutex_allocation); pid = fork(); -# ifdef OS2 if (pid == 0) { - sem_init(&semaphore_liste_threads, 0, 1); - sem_init(&semaphore_gestionnaires_signaux, 0, 0); - sem_init(&semaphore_gestionnaires_signaux_atomique, 0, 1); - sem_init(&((*s_etat_processus).semaphore_fork), 0, 0); - } -# endif - - if (pid == 0) - { -# ifdef _BROKEN_SIGINFO - liberation_fifos_signaux(s_etat_processus); - creation_fifos_signaux(s_etat_processus); -# endif + liberation_queue_signaux(s_etat_processus); + creation_queue_signaux(s_etat_processus); pthread_mutex_destroy(&mutex_allocation); debug_memoire_initialisation();