diff --git a/src/array.h b/src/array.h index 1521461953d14a7de3bb187ea0fada213b2f191b..45420bdf8193e22b5f29ca6bbc6154e344bc9f24 100644 --- a/src/array.h +++ b/src/array.h @@ -48,7 +48,7 @@ extern struct array empty_array; #define OP_SUB MINTERM(OP_TAKE_A,OP_SKIP_A ,OP_SKIP_B) -#define free_array(V) do{ struct array *v_=(V); if(!--v_->refs) really_free_array(v_); }while(0) +#define free_array(V) do{ struct array *v_=(V); debug_malloc_touch(v_); if(!--v_->refs) really_free_array(v_); }while(0) #define allocate_array(X) low_allocate_array((X),0) #define allocate_array_no_init(X,Y) low_allocate_array((X),(Y)) diff --git a/src/mapping.h b/src/mapping.h index e077b9b6e55e0ab2c73b37b2aba0844c4198a19e..01dea81b24b2d61053c985ec6379873c2e65d063 100644 --- a/src/mapping.h +++ b/src/mapping.h @@ -23,7 +23,7 @@ extern struct mapping *first_mapping; #define m_ind_types(m) ((m)->ind_types) #define m_val_types(m) ((m)->val_types) -#define free_mapping(M) do{ struct mapping *m_=(M); if(!--m_->refs) really_free_mapping(m_); }while(0) +#define free_mapping(M) do{ struct mapping *m_=(M); debug_malloc_touch(m_); if(!--m_->refs) really_free_mapping(m_); }while(0) /* Prototypes begin here */ struct keypair; diff --git a/src/multiset.h b/src/multiset.h index d9408e92a1573578f78041f0bbd91ed36d18853d..11b4740c83e21589332a572c467b729018d12463 100644 --- a/src/multiset.h +++ b/src/multiset.h @@ -17,7 +17,7 @@ struct multiset extern struct multiset *first_multiset; -#define free_multiset(L) do{ struct multiset *l_=(L); if(!--l_->refs) really_free_multiset(l_); }while(0) +#define free_multiset(L) do{ struct multiset *l_=(L); debug_malloc_touch(l_); if(!--l_->refs) really_free_multiset(l_); }while(0) #define l_sizeof(L) ((L)->ind->size) diff --git a/src/object.c b/src/object.c index 60d26241b3196fb5df6491590e7063cdf78d0a08..ce560fa5c04caa2a87a9573ca7c47d4c73a9c01f 100644 --- a/src/object.c +++ b/src/object.c @@ -4,7 +4,7 @@ ||| See the files COPYING and DISCLAIMER for more information. \*/ #include "global.h" -RCSID("$Id: object.c,v 1.35 1998/01/29 00:30:35 hubbe Exp $"); +RCSID("$Id: object.c,v 1.36 1998/01/29 22:53:55 hubbe Exp $"); #include "object.h" #include "dynamic_buffer.h" #include "interpret.h" @@ -363,6 +363,12 @@ void really_free_object(struct object *o) if(--o->refs > 0) return; } + if(o->parent) + { + free_object(o->parent); + o->parent=0; + } + if(o->prev) o->prev->next=o->next; else diff --git a/src/object.h b/src/object.h index 650b1cf851f36b26d436c40931d8819a29915c7f..ad06e1a8af2c2d6557466fbc26d5b81421181de6 100644 --- a/src/object.h +++ b/src/object.h @@ -29,7 +29,7 @@ extern struct object *first_object; extern struct object *master_object; extern struct program *master_program; -#define free_object(O) do{ struct object *o_=(O); if(!--o_->refs) really_free_object(o_); }while(0) +#define free_object(O) do{ struct object *o_=(O); debug_malloc_touch(o_); if(!--o_->refs) really_free_object(o_); }while(0) #define LOW_GET_GLOBAL(O,I,ID) ((O)->storage+INHERIT_FROM_INT((O)->prog, (I))->storage_offset+(ID)->func.offset) #define GET_GLOBAL(O,I) LOW_GET_GLOBAL(O,I,ID_FROM_INT((O)->prog,I)) diff --git a/src/pike_memory.c b/src/pike_memory.c index 416e4e011a06ece0fb3fc095a86a96808904ab14..ad3860956c95b5617292f83dac907fd98b1c9f0c 100644 --- a/src/pike_memory.c +++ b/src/pike_memory.c @@ -756,12 +756,19 @@ static void cleanup_memhdrs() mt_lock(&debug_malloc_mutex); if(verbose_debug_exit) { + int first=1; for(h=0;h<HSIZE;h++) { struct memhdr *m; for(m=hash[h];m;m=m->next) { struct memloc *l; + if(first) + { + fprintf(stderr,"\n"); + first=0; + } + fprintf(stderr, "LEAK: (%p) %d bytes\n",m->data, m->size); for(l=m->locations;l;l=l->next) fprintf(stderr," *** %s:%d (%d times) %s\n", diff --git a/src/program.c b/src/program.c index c2dfb0eab5913ac9f855122486166c9d9e50257d..0f13c71ef6d9d21b46330d8021f9438564540393 100644 --- a/src/program.c +++ b/src/program.c @@ -4,7 +4,7 @@ ||| See the files COPYING and DISCLAIMER for more information. \*/ #include "global.h" -RCSID("$Id: program.c,v 1.60 1998/01/29 17:43:22 hubbe Exp $"); +RCSID("$Id: program.c,v 1.61 1998/01/29 22:53:56 hubbe Exp $"); #include "program.h" #include "object.h" #include "dynamic_buffer.h" @@ -421,6 +421,7 @@ void low_start_new_program(struct program *p, #else fake_object=ALLOC_STRUCT(object); #endif + GC_ALLOC(); fake_object->next=fake_object; fake_object->prev=fake_object; @@ -579,6 +580,14 @@ void dump_program_desc(struct program *p) static void toss_compilation_resources(void) { + if(fake_object) + { + free_program(fake_object->prog); + fake_object->prog=0; + free_object(fake_object); + fake_object=0; + } + free_program(new_program); new_program=0; @@ -587,13 +596,6 @@ static void toss_compilation_resources(void) free((char *)malloc_size_program); malloc_size_program=0; } - - if(fake_object) - { - fake_object->prog=0; - free_object(fake_object); - fake_object=0; - } while(compiler_frame) pop_compiler_frame(); diff --git a/src/program.h b/src/program.h index 513c0b76ad2fc0fd0ecbe37b54346b44b464f4ba..76d244a39471ba37f7ea288f1b22217823e2f002 100644 --- a/src/program.h +++ b/src/program.h @@ -212,7 +212,7 @@ struct program #define FIND_LFUN(P,N) ((P)->flags & PROGRAM_FIXED?(P)->lfuns[(N)]:find_identifier(lfun_names[(N)],(P))) -#define free_program(p) do{ struct program *_=(p); if(!--_->refs) really_free_program(_); }while(0) +#define free_program(p) do{ struct program *_=(p); debug_malloc_touch(_); if(!--_->refs) really_free_program(_); }while(0) extern struct object *fake_object; extern struct program *new_program;