pike.git / src / module.c

version» Context lines:

pike.git/src/module.c:1:   /*   || This file is part of Pike. For copyright information see COPYRIGHT.   || Pike is distributed under GPL, LGPL and MPL. See the file COPYING   || for more information. - || $Id: module.c,v 1.43 2007/05/13 15:43:07 mast Exp $ + || $Id: module.c,v 1.44 2007/05/18 14:47:21 grubba Exp $   */      #include "global.h"   #include "module.h"   #include "pike_macros.h"   #include "pike_error.h"   #include "builtin_functions.h"   #include "main.h"   #include "svalue.h"   #include "interpret.h"
pike.git/src/module.c:33:   #include "module_support.h"      #include "modules/modlist_headers.h"   #ifndef PRE_PIKE   #include "post_modules/modlist_headers.h"   #endif      /* Define this to trace the initialization and cleanup of static modules. */   /* #define TRACE_MODULE */    + #ifdef PIKE_EXTRA_DEBUG + #define TRACE_MAIN + #define TRACE_MODULE + #endif +    #if defined(TRACE_MAIN) || defined(TRACE_MODULE)   #define TRACE(X) fprintf X   #else /* !TRACE_MAIN */   #define TRACE(X)   #endif /* TRACE_MAIN */      static void init_builtin_modules(void)   {    void init_iterators(void);   #ifdef WITH_FACETS
pike.git/src/module.c:138: Inside #if defined(DO_PIKE_CLEANUP)
      /* The use of markers below only works after a gc run where it    * hasn't freed anything. Since we've destructed all objects in    * exit_main, nothing should be left after the run above, so only    * one more run is necessary. */    gc_keep_markers = 1;    do_gc (NULL, 1);      #define STATIC_ARRAYS &empty_array, &weak_empty_array,    + #define STATIC_TYPES string0_type_string, string_type_string, \ +  int_type_string, object_type_string, program_type_string, \ +  float_type_string, mixed_type_string, array_type_string, \ +  multiset_type_string, mapping_type_string, function_type_string, \ +  type_type_string, void_type_string, zero_type_string, any_type_string, \ +  weak_type_string, +    #define REPORT_LINKED_LIST_LEAKS(TYPE, START, STATICS, T_TYPE, NAME) do { \    struct TYPE *x; \    for (x = START; x; x = x->next) { \    struct marker *m = find_marker (x); \    if (!m) { \    DO_IF_DEBUG ( \    fprintf (stderr, "Didn't find gc marker as expected for:\n"); \    describe_something (x, T_TYPE, 2, 2, 0, NULL); \    ); \    } \    else { \    int is_static = 0; \ -  static const struct TYPE *statics[] = {STATICS NULL}; \ +  /*static const*/ struct TYPE *statics[] = {STATICS NULL}; \    ptrdiff_t i; /* Use signed type to avoid warnings from gcc. */ \    for (i = 0; i < (ptrdiff_t) (NELEM (statics) - 1); i++) \    if (x == statics[i]) \    is_static = 1; \    if (x->refs != m->refs + is_static) { \    if (!leak_found) { \    fputs ("Leak(s) found at exit:\n", stderr); \    leak_found = 1; \    } \    fprintf (stderr, NAME " got %d unaccounted references: ", \
pike.git/src/module.c:177:    } \    } while (0)       REPORT_LINKED_LIST_LEAKS (array, first_array, STATIC_ARRAYS, T_ARRAY, "Array");    REPORT_LINKED_LIST_LEAKS (multiset, first_multiset, NOTHING, T_MULTISET, "Multiset");    REPORT_LINKED_LIST_LEAKS (mapping, first_mapping, NOTHING, T_MAPPING, "Mapping");    REPORT_LINKED_LIST_LEAKS (program, first_program, NOTHING, T_PROGRAM, "Program");    REPORT_LINKED_LIST_LEAKS (object, first_object, NOTHING, T_OBJECT, "Object");    report_all_type_leaks();    +  { +  size_t index; +  for (index = 0; index < pike_type_hash_size; index++) { +  REPORT_LINKED_LIST_LEAKS(pike_type, pike_type_hash[index], STATIC_TYPES, PIKE_T_TYPE, "Type"); +  } +  } +    #undef REPORT_LINKED_LIST_LEAKS       /* Just remove the extra external refs reported above and do    * another gc so that we don't report the blocks again in the low    * level dmalloc reports. */      #if 1    /* It can be a good idea to disable this to leave the blocks    * around to be reported by an external memchecker like valgrind.    * Ideally we should only free the svalues inside these things but