--- rpl/src/gestion_objets.c 2010/04/27 15:53:36 1.13 +++ rpl/src/gestion_objets.c 2010/05/16 19:36:20 1.17 @@ -877,6 +877,8 @@ liberation(struct_processus *s_etat_proc { if (decrementation_atomique(s_objet) > 0) { + liberation(s_etat_processus, (*((struct_fichier *) + (*s_objet).objet)).format); return; } @@ -1208,6 +1210,8 @@ liberation(struct_processus *s_etat_proc { if (decrementation_atomique(s_objet) > 0) { + liberation(s_etat_processus, (*((struct_socket *) + (*s_objet).objet)).format); return; } @@ -1749,6 +1753,14 @@ copie_objet(struct_processus *s_etat_pro if (type == 'P') { incrementation_atomique(s_objet); + + if (((*((struct_fichier *) ((*s_objet).objet))).format = + copie_objet(s_etat_processus, (*((struct_fichier *) + ((*s_objet).objet))).format, 'P')) == NULL) + { + return(NULL); + } + return(s_objet); } @@ -2265,6 +2277,14 @@ copie_objet(struct_processus *s_etat_pro if (type == 'P') { incrementation_atomique(s_objet); + + if (((*((struct_socket *) ((*s_nouvel_objet).objet))).format = + copie_objet(s_etat_processus, (*((struct_socket *) + ((*s_objet).objet))).format, 'P')) == NULL) + { + return(NULL); + } + return(s_objet); } @@ -2762,7 +2782,7 @@ 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).on_exit = NULL; + (*s_nouvel_etat_processus).at_exit = NULL; for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++) { @@ -3535,9 +3555,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 { @@ -3547,6 +3570,10 @@ 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; } struct_memoire; @@ -3555,6 +3582,7 @@ static unsigned long long ordre = 0; static pthread_mutex_t mutex_allocation = PTHREAD_MUTEX_INITIALIZER; #define check(a, b) ((strcmp(#a, fonction) == 0) && (ligne == b)) +#define CORE_DUMP void * debug_memoire_ajout(size_t taille, const unsigned char *fonction, @@ -3583,6 +3611,10 @@ debug_memoire_ajout(size_t taille, const (*debug).taille = taille; (*debug).ordre = ordre; +# ifdef __BACKTRACE + (*debug).profondeur = backtrace((*debug).pile, PROFONDEUR_PILE); +# endif + pthread_mutex_unlock(&mutex_allocation); if (((*debug).fonction = malloc((strlen(fonction) + 1) * @@ -3726,14 +3758,20 @@ debug_memoire_retrait(void *pointeur) } void -debug_memoire_verification(struct_processus *s_etat_processus) +debug_memoire_verification() { +# ifdef __BACKTRACE + char **appels; + + int j; +# endif + integer8 i; struct_memoire *element_courant; struct_memoire *element_suivant; - fprintf(stderr, "[%d-%llu] MEMORY LEAK\n", + fprintf(stderr, "[%d-%llu] LIST OF MEMORY LEAKS\n", getpid(), (unsigned long long) pthread_self()); pthread_mutex_lock(&mutex_allocation); @@ -3755,21 +3793,37 @@ debug_memoire_verification(struct_proces (unsigned long long) pthread_self(), (*element_courant).argument); - switch(i) +# 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) { - // Affichage des méditations - case 1: + for(j = 0; j < (*element_courant).profondeur; j++) { - break; + fprintf(stderr, "[%d-%llu] %s\n", getpid(), + (unsigned long long) pthread_self(), appels[j]); } + + free(appels); } +# endif + + fprintf(stderr, "\n"); i++; element_suivant = (*element_courant).suivant; + +# ifndef CORE_DUMP free((*element_courant).fonction); free((*element_courant).argument); free(element_courant); +# endif + element_courant = element_suivant; } @@ -3780,6 +3834,18 @@ debug_memoire_verification(struct_proces return; } + +void +analyse_post_mortem() +{ +# ifdef CORE_DUMP + BUG(debug != NULL, uprintf("[%d-%llu] CREATE CORE DUMP FILE FOR " + "POST MORTEM ANALYZE\n", getpid(), + (unsigned long long) pthread_self())); +# endif + + return; +} #endif