Branch: Tag:

2000-04-08

2000-04-08 02:01:09 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>

major improvements for DMALLOC

Rev: src/dmalloc.h:1.24
Rev: src/encode.c:1.58
Rev: src/gc.c:1.53
Rev: src/gc.h:1.24
Rev: src/interpret.c:1.139
Rev: src/interpret.h:1.40
Rev: src/language.yacc:1.179
Rev: src/object.c:1.99
Rev: src/object.h:1.40
Rev: src/pike_memory.c:1.63
Rev: src/program.c:1.223
Rev: src/program.h:1.86
Rev: src/svalue.c:1.65
Rev: src/svalue.h:1.49

5:   \*/   /**/   #include "global.h" - RCSID("$Id: program.c,v 1.222 2000/04/06 21:00:20 hubbe Exp $"); + RCSID("$Id: program.c,v 1.223 2000/04/08 02:01:09 hubbe Exp $");   #include "program.h"   #include "object.h"   #include "dynamic_buffer.h"
595:    }       new_program->flags |= PROGRAM_FIXED; +  + #ifdef DEBUG_MALLOC +  { + #define DBSTR(X) ((X)?(X)->str:"") +  int e,v; +  struct memory_map *m=dmalloc_alloc_mmap( DBSTR(lex.current_file), +  lex.current_line); +  for(e=0;e<new_program->num_inherits;e++) +  { +  struct inherit *i=new_program->inherits+e; +  char *tmp; +  char buffer[50]; +  +  for(v=0;v<i->prog->num_variable_index;v++) +  { +  int d=i->prog->variable_index[v]; +  struct identifier *id=i->prog->identifiers+d; +  +  dmalloc_add_mmap_entry(m, +  id->name->str, +  OFFSETOF(object,storage) + i->storage_offset + id->func.offset, +  sizeof_variable(id->run_time_type), +  1, /* count */ +  0,0);    }    -  +  if(i->name) +  { +  tmp=i->name->str; +  }else if(!(tmp=dmalloc_find_name(i->prog))){ +  /* Didn't find a given name, revert to ad-hoc method */ +  INT32 line,pos; +  +  for(pos=0;pos<100;pos++) +  { +  tmp=get_line(i->prog->program+pos, i->prog, &line); +  if(tmp && line) break; +  if(pos+1>=(long)i->prog->num_program) break; +  } +  if(!(tmp && line)) +  { +  sprintf(buffer,"inherit[%d]",e); +  tmp=buffer; +  } +  } +  dmalloc_add_mmap_entry(m, +  tmp, +  OFFSETOF(object, storage) + i->storage_offset, +  i->prog->storage_needed - i->prog->inherits[0].storage_offset, +  1, /* count */ +  0,0); +  +  } +  dmalloc_set_mmap_template(new_program, m); +  } + #endif + } +    struct program *low_allocate_program(void)   {    struct program *p;
708:    fake_object->parent_identifier=0;    fake_object->prog=p;    add_ref(p); +  + #ifdef PIKE_DEBUG +  fake_object->program_id=p->id; + #endif +    #ifdef PIKE_SECURITY    fake_object->prot=0;   #endif
1383:    */   void set_gc_check_callback(void (*m)(struct object *))   { -  new_program->gc_check=m; +  new_program->gc_check_func=m;   }      int low_reference_inherited_identifier(struct program_state *q,
3074:    if(lex.current_file)    {    store_linenumber(lex.current_line, lex.current_file); +  + #ifdef DEBUG_MALLOC +  if(strcmp(lex.current_file->str,"-") || lex.current_line!=1)    debug_malloc_name(new_program, lex.current_file->str, lex.current_line); -  + #endif    }    compilation_depth=0;   
3469:    {    free_svalue(& p->constants[e].sval);    p->constants[e].sval.type=T_INT; +  DO_IF_DMALLOC(p->constants[e].sval.u.refs=(void *)-1);    }       for(e=0;e<p->num_inherits;e++)
3483:    /* FIXME: Is there anything else that needs to be freed here? */    SET_NEXT_AND_FREE(p, free_program);    }else{ + #ifdef PIKE_DEBUG +  int e,tmp=0; +  for(e=0;e<p->num_constants;e++) +  { +  if(p->constants[e].sval.type == T_PROGRAM && p->constants[e].sval.u.program == p) +  tmp++; +  } +  if(tmp >= p->refs) +  fatal("garbage collector failed to free program!!!\n"); + #endif    next=p->next;    }    }