pike.git / src / list.c

version» Context lines:

pike.git/src/list.c:7:   #include "array.h"   #include "types.h"   #include "list.h"   #include "svalue.h"   #include "macros.h"   #include "memory.h"   #include "error.h"   #include "dynamic_buffer.h"   #include "interpret.h"   #include "builtin_efuns.h" + #include "gc.h"      struct list *first_list;      int list_member(struct list *l, struct svalue *ind)   {    return set_lookup(l->ind, ind) >= 0;   }      /*    * allocate and init a new list    */   static struct list *allocate_list(struct array *ind)   {    struct list *l; -  +  GC_ALLOC();    l=ALLOC_STRUCT(list);    l->next = first_list;    l->prev = 0;    l->refs = 1;    l->ind=ind;    if(first_list) first_list->prev = l;    first_list=l;       return l;   }
pike.git/src/list.c:49:    fatal("really free list on list with nonzero refs.\n");   #endif       free_array(l->ind);       if(l->prev) l->prev->next = l->next;    if(l->next) l->next->prev = l->prev;    if(first_list == l) first_list = 0;       free((char *)l); +  GC_FREE();   }      static void order_list(struct list *l)   {    INT32 *order;    order = get_set_order(l->ind);    l->ind = order_array(l->ind, order);    free((char *)order);   }   
pike.git/src/list.c:240:    for(;p;p=p->next)    {    if(p->pointer_a == (void *)l)    {    ret=(struct list *)p->pointer_b;    ret->refs++;    return ret;    }    }    -  ret=allocate_list(0); +  ret=allocate_list( & empty_array );    doing.pointer_b=(void *)ret;       ret->ind=copy_array_recursively(l->ind,&doing);       order_list(ret);       return ret;   } -  +  +  + #ifdef GC2 +  + void gc_mark_list_as_referenced(struct list *l) + { +  if(gc_mark(l)) +  gc_mark_array_as_referenced(l->ind); + } +  + void gc_check_all_lists() + { +  struct list *l; +  for(l=first_list;l;l=l->next) +  gc_check(l->ind); + } +  + void gc_mark_all_lists() + { +  struct list *l; +  for(l=first_list;l;l=l->next) +  if(gc_is_referenced(l)) +  gc_mark_list_as_referenced(l); + } +  + void gc_free_all_unreferenced_lists() + { +  struct list *l,*next; +  +  for(l=first_list;l;l=next) +  { +  if(gc_do_free(l)) +  { +  l->refs++; +  free_svalues(ITEM(l->ind), l->ind->size, l->ind->type_field); +  l->ind->size=0; +  next=l->next; +  +  free_list(l); +  }else{ +  next=l->next; +  } +  } + } +  + #endif /* GC2 */