Exemplo n.º 1
0
void long_freelist() {
    Busy_Header* b[20];
    for(int i = 0; i < 20; i++){
        b[i] = malloc(i);
        assert_addr_equal(get_freelist(), find_next(b[i]));
        assert_addr_equal(get_freelist()->prev, NULL);
    }


    Free_Header *freelist0 = get_freelist();
    for( int i = 0; i <20 ; i++){
        free(b[i]);
        assert_addr_equal(get_freelist(), b[i]);
        if (i+1 < 20)
            assert_addr_equal(find_next(get_freelist()), b[i+1]);
        assert_addr_equal(get_freelist()->prev, NULL);

    }
    //last free causes a merge
    Heap_Info info = verify_heap();
    assert_equal(info.busy, 0);
    assert_equal(info.free, 20);
    assert_equal(info.busy_size + info.free_size, get_heap_info().heap_size); // out of heap
    assert_addr_equal(get_freelist(), b[19]);
    assert_addr_equal(find_next(get_freelist()), get_heap_base() + info.heap_size); //out of heap
    assert_addr_equal(((Free_Header *)b[0])->next, NULL); //end

}
Exemplo n.º 2
0
int main(int ____c, char *____v[])
{
	setup_error_handlers();
	gc_begin_func();
	STRING(s1);
	STRING(s2);
	STRING(t);
	bool s1t;
	bool s2t;
	s1 = String_new("hellp");
	s2 = String_new("aello");
	t = String_new("hello");
	s1t = str_gt(s1,t);
	if (s1t) {
		gt_msg(s1,t);
	}
	else {
		le_msg(s1,t);
	}
	s2t = str_gt(s2,t);
	if (s2t) {
		gt_msg(s2,t);
	}
	else {
		le_msg(s2,t);
	}
	gc_end_func();

	gc();
	Heap_Info info = get_heap_info();
	if ( info.live!=0 ) fprintf(stderr, "%d objects remain after collection\n", info.live);
	gc_shutdown();
	return 0;
}
Exemplo n.º 3
0
/**
 * @ingroup EnvRuntimeInformationDetail
 * @brief Function <b>get_heap_usage</b> returns the number of bytes used by the heap.
 *
 * @return			a <b>size_t</b> value of the number of bytes used by
 *				the heap.
 */
inline size_t get_heap_usage() {
  size_t heap_size = 0;
  size_t largest_free = 0;
  get_heap_info(heap_size, largest_free);

  return heap_size;
}
Exemplo n.º 4
0
void rtems_resource_snapshot_take(rtems_resource_snapshot *snapshot)
{
  uint32_t *active = &snapshot->active_posix_keys;
  size_t i;

  memset(snapshot, 0, sizeof(*snapshot));

  _RTEMS_Lock_allocator();

  _Thread_Kill_zombies();

  get_heap_info(RTEMS_Malloc_Heap, &snapshot->heap_info);
  get_heap_info(&_Workspace_Area, &snapshot->workspace_info);

  for (i = 0; i < RTEMS_ARRAY_SIZE(objects_info_table); ++i) {
    active [i] = _Objects_Active_count(objects_info_table[i]);
  }

  _RTEMS_Unlock_allocator();

  snapshot->active_posix_key_value_pairs = get_active_posix_key_value_pairs();
  snapshot->open_files = open_files();
}
Exemplo n.º 5
0
int main(int ____c, char *____v[])
{
	setup_error_handlers();
	gc_begin_func();
	int argc;
	STRING(argv);
	argc = 1;
	argv = String_new("hello world");
	print_string(String_add(argv,String_from_int(argc)));
	gc_end_func();

	gc();
	Heap_Info info = get_heap_info();
	if ( info.live!=0 ) fprintf(stderr, "%d objects remain after collection\n", info.live);
	gc_shutdown();
	return 0;
}
Exemplo n.º 6
0
int main(int ____c, char *____v[])
{
	setup_error_handlers();
	gc_begin_func();
	int x;
	double y;
	x = 1;
	y = (3.14 + x);
	printf("%1.2f\n", y);
	gc_end_func();

	gc();
	Heap_Info info = get_heap_info();
	if ( info.live!=0 ) fprintf(stderr, "%d objects remain after collection\n", info.live);
	gc_shutdown();
	return 0;
}
Exemplo n.º 7
0
//allocate 10 consecutive chunks, free from the back to the front
//should fuse the heap to one free chunk
void fuse_to_one() {
    Busy_Header* b[10];
    for(int i = 0; i < 10; i++){
        b[i] = malloc(100);
        assert_addr_equal(get_freelist(), find_next(b[i]));
        assert_addr_equal(get_freelist()->prev, NULL);
    }
    Free_Header *freelist0 = get_freelist();
    for( int i = 9; i >= 0 ; i--){
        free(b[i]);
        assert_addr_equal(get_freelist(), b[i]);
        assert_addr_equal(get_freelist()->prev, NULL);
    }
    Heap_Info info = verify_heap();
    assert_equal(info.busy, 0);
    assert_equal(info.free, 1);
    assert_equal(info.busy_size + info.free_size, get_heap_info().heap_size);
    assert_addr_equal(find_next(get_freelist()), get_heap_base() + info.heap_size);
    assert_addr_equal(freelist0->next, NULL);
}
Exemplo n.º 8
0
//skip first free chunk, which is not big enough
void search_along_list() {
    printf("after allocation:\n");
    Busy_Header* b[4];
    for(int i = 0; i < 4; i++){
        b[i] = malloc(450);
        printf("b[%d]: %p\n", i, b[i]);
    }
    assert_equal(b[0]->size & SIZEMASK, request2size(450));
    assert_equal(b[1]->size & SIZEMASK, request2size(450));
    assert_equal(b[2]->size & SIZEMASK, request2size(450));
    assert_equal(b[3]->size & SIZEMASK, request2size(450));
    Free_Header* f4 = find_next(b[3]);
    printf("head: %p\n", f4);

    Heap_Info info = verify_heap();
    assert_equal(info.busy, 4);
    assert_equal(info.free, 1);
    assert_equal(info.busy_size, 1824);
    assert_equal(info.free_size, 176);
    assert_addr_equal(get_freelist(), f4);
    assert_addr_equal(get_freelist()->next, NULL);
    assert_addr_equal(get_freelist()->prev, NULL);

    //after malloc, free b3, b0
    free(b[3]);
    free(b[0]);
    Busy_Header *skip = malloc(600);

    printf("after malloc(600)\n");
    Free_Header *head = get_freelist();
    print_both_ways(head);

    info = verify_heap();
    assert_equal(info.busy, 3);
    assert_equal(info.free, 2);
    assert_equal(info.busy_size + info.free_size, get_heap_info().heap_size);
}
Exemplo n.º 9
0
void
bar(PVector_ptr x)
{
    gc_begin_func();
    set_ith(x, 1 - 1, 100);
    print_vector(x);
    gc_end_func();
}


int main(int ____c, char *____v[])
{
    setup_error_handlers();
    gc_begin_func();
    VECTOR(x);
    x = Vector_new((double[]) {
                   1, 2, 3}, 3);
    bar(PVector_copy(x));
    set_ith(x, 2 - 1, 99);
    print_vector(x);
    gc_end_func();
    gc();
    Heap_Info info = get_heap_info();

    if (info.live != 0)
        fprintf(stderr, "%d objects remain after collection\n", info.live);
    gc_shutdown();
    return 0;
}
Exemplo n.º 10
0
Heap_Info verify_heap() {
	Heap_Info info = get_heap_info();
	assert_equal(info.heap_size, HEAP_SIZE);
	assert_equal(info.heap_size, info.busy_size+info.free_size);
	return info;
}
Exemplo n.º 11
0
static void gc_check()
{
	gc();
	Heap_Info info = get_heap_info();
	if ( info.live!=0 ) fprintf(stderr, "%d objects remain after collection\n", info.live);
}
Exemplo n.º 12
0
//split chunk
void split_chunk(){
    printf("after allocation:\n");
    Busy_Header* b[4];
    for(int i = 0; i < 4; i++){
        b[i] = malloc(450);
        printf("b[%d]: %p\n", i, b[i]);
    }
    assert_equal(b[0]->size & SIZEMASK, request2size(450));
    assert_equal(b[1]->size & SIZEMASK, request2size(450));
    assert_equal(b[2]->size & SIZEMASK, request2size(450));
    assert_equal(b[3]->size & SIZEMASK, request2size(450));
    Free_Header* f4 = find_next(b[3]);
    printf("head: %p\n", f4);

    Heap_Info info = verify_heap();
    assert_equal(info.busy, 4);
    assert_equal(info.free, 1);
    assert_equal(info.busy_size, 1824);
    assert_equal(info.free_size, 176);
    assert_addr_equal(get_freelist(), f4);
    assert_addr_equal(get_freelist()->next, NULL);
    assert_addr_equal(get_freelist()->prev, NULL);

    free(b[2]);

    info = verify_heap();
    assert_equal(info.busy, 3);
    assert_equal(info.free, 2);
    assert_equal(info.busy_size, 1368);
    assert_equal(info.free_size, 632);
    assert_addr_equal(get_freelist(), b[2]);
    assert_addr_equal(get_freelist()->next, f4);
    assert_addr_equal(get_freelist()->next->next, NULL);
    assert_addr_equal(f4->prev, b[2]);
    assert_addr_equal(f4->prev->prev, NULL);
    printf("after free b[2]\n");
    Free_Header *head = get_freelist();
    print_both_ways(head);


    free(b[0]);
    info = verify_heap();
    assert_equal(info.busy, 2);
    assert_equal(info.free, 3);
    assert_equal(info.busy_size, 912);
    assert_equal(info.free_size, 1088);
    assert_addr_equal(get_freelist(), b[0]);
    assert_addr_equal(get_freelist()->next, b[2]);
    assert_addr_equal(get_freelist()->next->next, f4);
    assert_addr_equal(get_freelist()->next->next->next, NULL);
    assert_addr_equal(f4->prev, b[2]);
    assert_addr_equal(f4->prev->prev, b[0]);
    assert_addr_equal(f4->prev->prev->prev, NULL);

    printf("after free b[0]\n");
    head = get_freelist();
    print_both_ways(head);

    Busy_Header *split = malloc(200);

    printf("after malloc(200)\n");
    head = get_freelist();
    print_both_ways(head);

    assert_addr_equal(split, get_heap_base());
    Free_Header *newhead = get_freelist();
    assert_addr_equal(find_next(split),newhead);
    assert_addr_equal(get_freelist(), find_next(split));
    assert_addr_equal(get_freelist()->next, b[2]);
    assert_addr_equal(get_freelist()->next->next, f4);
    assert_addr_equal(get_freelist()->next->next->next, NULL);
    assert_addr_equal(f4->prev, b[2]);
    assert_addr_equal(f4->prev->prev, newhead);
    assert_addr_equal(f4->prev->prev->prev, NULL);
    info = verify_heap();
    assert_equal(info.busy, 3);
    assert_equal(info.free, 3);
    assert_equal(info.busy_size + info.free_size, get_heap_info().heap_size); // out of heap*/
}