--- rpl/src/gestion_objets.c 2010/06/19 15:54:51 1.28 +++ rpl/src/gestion_objets.c 2011/06/21 07:45:22 1.50 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.16 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.0.prerelease.1 + Copyright (C) 1989-2011 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,7 +20,7 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" /* @@ -57,7 +57,7 @@ decrementation_atomique(struct_objet *s_ return((*s_objet).nombre_occurrences); } -inline void +void initialisation_objet(struct_objet *s_objet) { pthread_mutexattr_t attributs_mutex; @@ -758,6 +758,9 @@ 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; @@ -1127,9 +1130,15 @@ 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)) != 0) + (*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; } @@ -1155,18 +1164,25 @@ liberation(struct_processus *s_etat_proc } if (pthread_mutex_unlock(&((*(*((struct_processus_fils *) - (*s_objet).objet)).thread).mutex)) != 0) + (*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 *) (*s_objet).objet)).thread).mutex)); + pthread_mutex_destroy(&((*(*((struct_processus_fils *) + (*s_objet).objet)).thread).mutex_nombre_references)); free((*((struct_processus_fils *) (*s_objet).objet)).thread); - } if (decrementation_atomique(s_objet) > 0) @@ -1497,6 +1513,9 @@ 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; @@ -2267,9 +2286,15 @@ 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)) != 0) + (*s_objet).objet)).thread).mutex_nombre_references)) != 0) { + pthread_sigmask(SIG_SETMASK, &oldset, NULL); + sigpending(&set); + return(NULL); } @@ -2277,11 +2302,17 @@ copie_objet(struct_processus *s_etat_pro .nombre_references++; if (pthread_mutex_unlock(&((*(*((struct_processus_fils *) - (*s_objet).objet)).thread).mutex)) != 0) + (*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); @@ -2295,7 +2326,6 @@ copie_objet(struct_processus *s_etat_pro (*((struct_processus_fils *) (*s_nouvel_objet).objet)) = (*((struct_processus_fils *) (*s_objet).objet)); - break; } @@ -2799,6 +2829,7 @@ copie_etat_processus(struct_processus *s # endif (*s_nouvel_etat_processus).var_volatile_processus_pere = 0; + (*s_nouvel_etat_processus).var_volatile_processus_racine = 0; (*s_nouvel_etat_processus).fichiers_graphiques = NULL; (*s_nouvel_etat_processus).entree_standard = NULL; (*s_nouvel_etat_processus).s_marques = NULL; @@ -2829,6 +2860,8 @@ copie_etat_processus(struct_processus *s (*s_nouvel_etat_processus).nombre_interruptions_non_affectees = 0; (*s_nouvel_etat_processus).at_exit = NULL; + (*s_nouvel_etat_processus).at_poke = NULL; + (*s_nouvel_etat_processus).traitement_at_poke = 'N'; for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++) { @@ -2840,10 +2873,17 @@ copie_etat_processus(struct_processus *s if ((*s_nouvel_etat_processus).generateur_aleatoire != NULL) { - (*s_nouvel_etat_processus).generateur_aleatoire = NULL; - } + if (((*s_nouvel_etat_processus).generateur_aleatoire = + gsl_rng_clone((*s_etat_processus).generateur_aleatoire)) + == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return(NULL); + } - (*s_nouvel_etat_processus).type_generateur_aleatoire = NULL; + gsl_rng_set((*s_nouvel_etat_processus).generateur_aleatoire, + gsl_rng_get((*s_etat_processus).generateur_aleatoire)); + } // Copie de la localisation @@ -3070,75 +3110,16 @@ copie_etat_processus(struct_processus *s * Copie de la table des variables */ - if (((*s_nouvel_etat_processus).s_liste_variables = - malloc((*s_etat_processus).nombre_variables_allouees * - sizeof(struct_variable))) == NULL) + if (((*s_nouvel_etat_processus).s_arbre_variables = + copie_arbre_variables(s_etat_processus)) == 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; i++) - { - if (((*s_nouvel_etat_processus).s_liste_variables[i].nom = - malloc((strlen((*s_etat_processus).s_liste_variables[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[i].nom, - (*s_etat_processus).s_liste_variables[i].nom); - - (*s_nouvel_etat_processus).s_liste_variables[i].origine = - (*s_etat_processus).s_liste_variables[i].origine; - (*s_nouvel_etat_processus).s_liste_variables[i].niveau = - (*s_etat_processus).s_liste_variables[i].niveau; - (*s_nouvel_etat_processus).s_liste_variables[i].variable_statique = - (*s_etat_processus).s_liste_variables[i].variable_statique; - (*s_nouvel_etat_processus).s_liste_variables[i].variable_partagee = - (*s_etat_processus).s_liste_variables[i].variable_partagee; - (*s_nouvel_etat_processus).s_liste_variables[i].variable_verrouillee = - (*s_etat_processus).s_liste_variables[i].variable_verrouillee; + // 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. - // Les définitions sont partagées entre tous les threads. - - if ((*s_etat_processus).s_liste_variables[i].niveau == 0) - { - (*s_nouvel_etat_processus).s_liste_variables[i].objet = - (*s_etat_processus).s_liste_variables[i].objet; - } - else - { - if (((*s_nouvel_etat_processus).s_liste_variables[i].objet = - copie_objet(s_etat_processus, - (*s_etat_processus).s_liste_variables[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_etat_processus).l_liste_variables_par_niveau = NULL; /* * Copie de la table des variables statiques @@ -3971,8 +3952,23 @@ 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 + pthread_mutex_destroy(&mutex_allocation); debug_memoire_initialisation(); }