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); }
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 }
/* @{ */ T * get_ptr() const volatile { return extract_ptr(ptr); }