--- rpl/src/gestion_objets.c 2010/02/28 14:47:14 1.6 +++ rpl/src/gestion_objets.c 2010/05/13 19:09:18 1.16 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.11 + RPL/2 (R) version 4.0.15 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. @@ -2721,7 +2721,16 @@ 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 (*s_nouvel_etat_processus).var_volatile_processus_pere = 0; (*s_nouvel_etat_processus).fichiers_graphiques = NULL; @@ -2753,6 +2762,8 @@ copie_etat_processus(struct_processus *s (*s_nouvel_etat_processus).nombre_interruptions_en_queue = 0; (*s_nouvel_etat_processus).nombre_interruptions_non_affectees = 0; + (*s_nouvel_etat_processus).at_exit = NULL; + for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++) { (*s_nouvel_etat_processus).corps_interruptions[i] = NULL; @@ -3032,6 +3043,8 @@ copie_etat_processus(struct_processus *s (*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; @@ -3522,9 +3535,12 @@ copie_etat_processus(struct_processus *s #undef fprintf +#ifdef __BACKTRACE #define return(a) { if (a == NULL) \ { BACKTRACE(20); fprintf(stderr, ">>> MEDITATION %d\n", __LINE__); } \ return(a); } while(0) +#define PROFONDEUR_PILE 64 +#endif typedef struct memoire { @@ -3534,7 +3550,13 @@ typedef struct memoire unsigned long ligne; size_t taille; unsigned long long ordre; +# ifdef __BACKTRACE + void *pile[PROFONDEUR_PILE]; + int profondeur; +# endif struct memoire *suivant; + pthread_t thread; + pid_t pid; } struct_memoire; static struct_memoire *debug = NULL; @@ -3569,6 +3591,12 @@ debug_memoire_ajout(size_t taille, const (*debug).ligne = ligne; (*debug).taille = taille; (*debug).ordre = ordre; + (*debug).thread = pthread_self(); + (*debug).pid = getpid(); + +# ifdef __BACKTRACE + (*debug).profondeur = backtrace((*debug).pile, PROFONDEUR_PILE); +# endif pthread_mutex_unlock(&mutex_allocation); @@ -3715,6 +3743,12 @@ debug_memoire_retrait(void *pointeur) void debug_memoire_verification(struct_processus *s_etat_processus) { +# ifdef __BACKTRACE + char **appels; +# endif + + int j; + integer8 i; struct_memoire *element_courant; @@ -3730,28 +3764,44 @@ debug_memoire_verification(struct_proces while(element_courant != NULL) { - fprintf(stderr, "[%d-%llu] MEDITATION %lld (%llu)\n", getpid(), - (unsigned long long) pthread_self(), i, - (*element_courant).ordre); - fprintf(stderr, "[%d-%llu] P: %p, F: %s(), L: %lu, S: %d\n", - getpid(), (unsigned long long) pthread_self(), - (*element_courant).pointeur, - (*element_courant).fonction, (*element_courant).ligne, - (int) (*element_courant).taille); - fprintf(stderr, "[%d-%llu] A: %s\n", getpid(), - (unsigned long long) pthread_self(), - (*element_courant).argument); - - switch(i) + if (((*element_courant).pid == getpid()) && + (pthread_equal((*element_courant).thread, pthread_self()) != 0)) { - // Affichage des méditations - case 1: + fprintf(stderr, "[%d-%llu] MEDITATION %lld (%llu)\n", getpid(), + (unsigned long long) pthread_self(), i, + (*element_courant).ordre); + fprintf(stderr, "[%d-%llu] P: %p, F: %s(), L: %lu, S: %d\n", + getpid(), (unsigned long long) pthread_self(), + (*element_courant).pointeur, + (*element_courant).fonction, (*element_courant).ligne, + (int) (*element_courant).taille); + fprintf(stderr, "[%d-%llu] A: %s\n", getpid(), + (unsigned long long) pthread_self(), + (*element_courant).argument); + +# ifdef __BACKTRACE + appels = backtrace_symbols((*element_courant).pile, + (*element_courant).profondeur); + + fprintf(stderr, "[%d-%llu] BACKTRACE\n", + getpid(), (unsigned long long) pthread_self()); + + if (appels != NULL) { - break; + for(j = 0; j < (*element_courant).profondeur; j++) + { + fprintf(stderr, "[%d-%llu] %s\n", getpid(), + (unsigned long long) pthread_self(), appels[j]); + } + + free(appels); } - } +# endif - i++; + fprintf(stderr, "\n"); + + i++; + } element_suivant = (*element_courant).suivant; free((*element_courant).fonction);