From a3c6ad53cdcb6b163d66a5a644d9c5bf1f10bb0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net> Date: Thu, 29 Jan 1998 14:53:57 -0800 Subject: [PATCH] inline should now work better.... + a huge memory leak fixed Rev: src/array.h:1.7 Rev: src/mapping.h:1.8 Rev: src/multiset.h:1.6 Rev: src/object.c:1.36 Rev: src/object.h:1.16 Rev: src/pike_memory.c:1.11 Rev: src/program.c:1.61 Rev: src/program.h:1.30 --- src/array.h | 2 +- src/mapping.h | 2 +- src/multiset.h | 2 +- src/object.c | 8 +++++++- src/object.h | 2 +- src/pike_memory.c | 7 +++++++ src/program.c | 18 ++++++++++-------- src/program.h | 2 +- 8 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/array.h b/src/array.h index 1521461953..45420bdf81 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 e077b9b6e5..01dea81b24 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 d9408e92a1..11b4740c83 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 60d26241b3..ce560fa5c0 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 650b1cf851..ad06e1a8af 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 416e4e011a..ad3860956c 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 c2dfb0eab5..0f13c71ef6 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 513c0b76ad..76d244a394 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; -- GitLab