コード例 #1
0
ファイル: gc.c プロジェクト: silkycove/mruby
static void
clear_all_old(mrb_state *mrb)
{
  size_t origin_mode = mrb->is_generational_gc_mode;

  gc_assert(is_generational(mrb));
  if (is_major_gc(mrb)) {
    advance_phase(mrb, GC_STATE_NONE);
  }

  mrb->is_generational_gc_mode = FALSE;
  prepare_incremental_sweep(mrb);
  advance_phase(mrb, GC_STATE_NONE);
  mrb->variable_gray_list = mrb->gray_list = NULL;
  mrb->is_generational_gc_mode = origin_mode;
}
コード例 #2
0
ファイル: gc.c プロジェクト: forkall/groonga
static void
change_gen_gc_mode(mrb_state *mrb, mrb_int enable)
{
  if (is_generational(mrb) && !enable) {
    if (is_major_gc(mrb)) {
      advance_phase(mrb, GC_STATE_NONE);
    }
    else {
      clear_all_old(mrb);
      gc_assert(mrb->gc_state == GC_STATE_NONE);
    }
    mrb->gc_full = FALSE;
  }
  else if (!is_generational(mrb) && enable) {
    advance_phase(mrb, GC_STATE_NONE);
    mrb->majorgc_old_threshold = mrb->gc_live_after_mark/100 * DEFAULT_MAJOR_GC_INC_RATIO;
    mrb->gc_full = FALSE;
  }
  mrb->is_generational_gc_mode = enable;
}
コード例 #3
0
ファイル: gc.c プロジェクト: silkycove/mruby
void
test_incremental_gc(void)
{
  mrb_state *mrb = mrb_open();
  size_t max = ~0, live = 0, total = 0, freed = 0;
  RVALUE *free;
  struct heap_page *page;

  puts("test_incremental_gc");
  change_gen_gc_mode(mrb, FALSE);

  puts("  in mrb_garbage_collect");
  mrb_garbage_collect(mrb);

  gc_assert(mrb->gc_state == GC_STATE_NONE);
  puts("  in GC_STATE_NONE");
  incremental_gc(mrb, max);
  gc_assert(mrb->gc_state == GC_STATE_MARK);
  puts("  in GC_STATE_MARK");
  advance_phase(mrb, GC_STATE_SWEEP);
  gc_assert(mrb->gc_state == GC_STATE_SWEEP);

  puts("  in GC_STATE_SWEEP");
  page = mrb->heaps;
  while (page) {
    RVALUE *p = page->objects;
    RVALUE *e = p + MRB_HEAP_PAGE_SIZE;
    while (p<e) {
      if (is_black(&p->as.basic)) {
        live++;
      }
      if (is_gray(&p->as.basic) && !is_dead(mrb, &p->as.basic)) {
        printf("%p\n", &p->as.basic);
      }
      p++;
    }
    page = page->next;
    total += MRB_HEAP_PAGE_SIZE;
  }

  gc_assert(mrb->gray_list == NULL);

  incremental_gc(mrb, max);
  gc_assert(mrb->gc_state == GC_STATE_SWEEP);

  incremental_gc(mrb, max);
  gc_assert(mrb->gc_state == GC_STATE_NONE);

  free = (RVALUE*)mrb->heaps->freelist;
  while (free) {
   freed++;
   free = (RVALUE*)free->as.free.next;
  }

  gc_assert(mrb->live == live);
  gc_assert(mrb->live == total-freed);

  puts("test_incremental_gc(gen)");
  advance_phase(mrb, GC_STATE_SWEEP);
  change_gen_gc_mode(mrb, TRUE);

  gc_assert(mrb->gc_full == FALSE);
  gc_assert(mrb->gc_state == GC_STATE_NONE);

  puts("  in minor");
  gc_assert(is_minor_gc(mrb));
  gc_assert(mrb->majorgc_old_threshold > 0);
  mrb->majorgc_old_threshold = 0;
  mrb_incremental_gc(mrb);
  gc_assert(mrb->gc_full == TRUE);
  gc_assert(mrb->gc_state == GC_STATE_NONE);

  puts("  in major");
  gc_assert(is_major_gc(mrb));
  do {
    mrb_incremental_gc(mrb);
  } while (mrb->gc_state != GC_STATE_NONE);
  gc_assert(mrb->gc_full == FALSE);

  mrb_close(mrb);
}