コード例 #1
0
ファイル: state.c プロジェクト: picrin-scheme/benz
void
pic_close(pic_state *pic)
{
  pic_allocf allocf = pic->allocf;

  /* clear out root objects */
  pic->cxt = &pic->default_cxt;
  pic->ai = 0;
  pic->halt = pic_invalid_value(pic);
  pic->globals = pic_invalid_value(pic);
  pic->features = pic_invalid_value(pic);
  pic->dyn_env = pic_invalid_value(pic);

  assert(pic->cxt->ai == 0);
  assert(pic->cxt->pc == NULL);
  assert(pic->cxt->fp == NULL);
  assert(pic->cxt->sp == NULL);
  assert(pic->cxt->irep == NULL);
  assert(pic->cxt->prev == NULL);

  /* free all heap objects */
  pic_gc(pic);

  /* free heaps */
  pic_heap_close(pic, pic->heap);

  /* free global stacks */
  kh_destroy(oblist, &pic->oblist);

  /* free GC arena */
  allocf(pic->userdata, pic->arena, 0);
  allocf(pic->userdata, pic, 0);
}
コード例 #2
0
ファイル: gc.c プロジェクト: picrin-scheme/benz
struct object *
pic_obj_alloc_unsafe(pic_state *pic, int type)
{
  struct object *obj;

  if (pic->heap->pages == NULL) {
    heap_morecore(pic);
  }

#if GC_STRESS
  pic_gc(pic);
#endif

  obj = obj_alloc(pic, type);
  if (obj == NULL) {
    pic_gc(pic);
    obj = obj_alloc(pic, type);
    if (obj == NULL)
      pic_panic(pic, "GC memory exhausted");
  }

  return obj;
}
コード例 #3
0
ファイル: gc.c プロジェクト: omasanori/picrin
struct object *
pic_obj_alloc_unsafe(pic_state *pic, int type)
{
  struct object *obj;
  size_t size = type2size(type);

  if (pic->gc_count > PIC_GC_PERIOD) {
    pic_gc(pic);
    pic->gc_count -= PIC_GC_PERIOD;
  }

  obj = pic_malloc(pic, size);
  obj->tt = type;
  obj->next = pic->gc_head.next;
  pic->gc_head.next = obj;

  pic->gc_count += size;

  return obj;
}