コード例 #1
0
ファイル: memory_old.c プロジェクト: shikantaza/pLisp
void gc_orig(BOOLEAN force, BOOLEAN clear_black)
{
  static unsigned long count = 0;

  if(!can_do_gc)
    return;

  //no new objects were created since the
  //last GC cycle, so nothing to do.
  if(is_set_empty(WHITE))
    return;

  //do GC every GC_FREQUENCYth time called
  if((count % GC_FREQUENCY) != 0)
    return;

  //printf("Entering GC cycle... ");

  unsigned int dealloc_words = memory_deallocated();

  //assert(is_set_empty(GREY));

  build_grey_set();

  assert(!is_set_empty(GREY));

  while(!is_set_empty(GREY))
  {
    OBJECT_PTR obj = get_an_object_from_grey();

    assert(is_dynamic_memory_object(obj));

    //FUNCTION2 and MACRO2 objects are handled
    //by handling their undelying CONS objects
    if(!IS_FUNCTION2_OBJECT(obj) && !IS_MACRO2_OBJECT(obj))
      insert_node(BLACK, obj);

    remove_node(GREY, obj);

    if(IS_CONS_OBJECT(obj))
    {
      move_from_white_to_grey(car(obj));
      move_from_white_to_grey(cdr(obj));
    }
    else if(IS_CLOSURE_OBJECT(obj) || IS_MACRO_OBJECT(obj))
    {
      move_from_white_to_grey(get_env_list(obj));
      move_from_white_to_grey(get_params_object(obj));
      move_from_white_to_grey(get_body_object(obj));
      move_from_white_to_grey(get_source_object(obj));
    }
    else if(IS_ARRAY_OBJECT(obj))
    {
      uintptr_t ptr = extract_ptr(obj);

      //OBJECT_PTR length_obj = get_heap(ptr, 0);

      //move_from_white_to_grey(length_obj);

      //int len = get_int_value(length_obj);
      int len = *((OBJECT_PTR *)ptr);

      int i;

      for(i=1; i<=len; i++)
        move_from_white_to_grey(get_heap(ptr, i));
    }
    else if(IS_CONTINUATION_OBJECT(obj))
      move_from_white_to_grey(get_heap(extract_ptr(obj), 0));
    else if(IS_FUNCTION2_OBJECT(obj) || IS_MACRO2_OBJECT(obj))
    {
      OBJECT_PTR cons_equiv = cons_equivalent(obj);
      //move_from_white_to_grey(car(cons_equiv));
      //move_from_white_to_grey(cdr(cons_equiv));
      move_from_white_to_grey(cons_equiv);
    }
  } //end of while(!is_set_empty(GREY))

  free_white_set_objects();

  assert(is_set_empty(GREY));
  assert(is_set_empty(WHITE));

  assert(!is_set_empty(BLACK));

  /* if(clear_black) */
    /* recreate_black(); */

  /* if(clear_black) */
  /*   assert(is_set_empty(BLACK)); */

  //printf("%d words deallocated in current GC cycle\n", memory_deallocated() - dealloc_words);
}
コード例 #2
0
ファイル: memory_old.c プロジェクト: shikantaza/pLisp
void dealloc(OBJECT_PTR ptr)
{
  unsigned int prev_words_deallocated = words_deallocated;

  if(!is_valid_object(ptr))
  {
    printf("%d\n", ptr);
    assert(false);
  }

  unsigned int tag = ptr & BIT_MASK;

  OBJECT_PTR array_size;

  switch(tag)
  {
    case CONS_TAG:
      words_deallocated += 2;
      break;
    case ARRAY_TAG:
      array_size = *((OBJECT_PTR *)extract_ptr(ptr));
      words_deallocated += (array_size + 1);
      break;
    case CLOSURE_TAG:
      words_deallocated += 4;
      break;
    case MACRO_TAG:
      words_deallocated += 4;
      break;
    case CONTINUATION_TAG:
      words_deallocated += 1;
      break;
    case INTEGER_TAG:
      words_deallocated += 1;
      break;
    case FLOAT_TAG:
      words_deallocated += 1;
      break;
    /* case FUNCTION2_TAG: */
    /*   words_allocated += 2; */
    /*   break; */
    /* case MACRO2_TAG: */
    /*   words_allocated += 2; */
    /*   break; */
    case NATIVE_FN_TAG:
      words_deallocated += 1;
      break;
    default:
      assert(false);
  }

  uintptr_t p = extract_ptr(ptr);
  int i;
  for(i=0; i < words_deallocated - prev_words_deallocated; i++)
    *((OBJECT_PTR *)p+i) = 0xFEEEFEEE;

#ifdef WIN32
  __mingw_aligned_free((void *)extract_ptr(ptr));
#else
  free((void *)extract_ptr(ptr));
#endif
}
コード例 #3
0
 /* @{ */
 T * get_ptr() const volatile
 {
     return extract_ptr(ptr);
 }