Example #1
0
static void extend_descriptors(rtems_rbheap_control *control)
{
  rtems_chain_control *chain =
    rtems_rbheap_get_spare_descriptor_chain(control);

  rtems_rbheap_set_extend_descriptors(
    control,
    rtems_rbheap_extend_descriptors_never
  );

  rtems_chain_initialize(
    chain,
    chunks,
    PAGE_COUNT,
    sizeof(chunks [0])
  );
}
static void
rtems_bsd_page_init(void *arg)
{
	rtems_status_code sc;
	void *area;
	void **obj_table;
	rtems_rbheap_chunk *chunks;
	size_t i;
	size_t n;
	uintptr_t heap_size;

	mtx_init(&page_heap_mtx, "page heap", NULL, MTX_DEF);

	heap_size = rtems_bsd_get_allocator_domain_size(
	    RTEMS_BSD_ALLOCATOR_DOMAIN_PAGE);

	area = rtems_heap_allocate_aligned_with_boundary(heap_size, PAGE_SIZE,
	    0);
	BSD_ASSERT(area != NULL);

	sc = rtems_rbheap_initialize(&page_heap, area, heap_size, PAGE_SIZE,
	    rtems_rbheap_extend_descriptors_with_malloc, NULL);
	BSD_ASSERT(sc == RTEMS_SUCCESSFUL);

	rtems_rbheap_set_extend_descriptors(&page_heap,
	    rtems_rbheap_extend_descriptors_never);

	n = heap_size / PAGE_SIZE;

	chunks = malloc(n * sizeof(*chunks), M_RTEMS_HEAP, M_NOWAIT);
	BSD_ASSERT(chunks != NULL);

	for (i = 0; i < n; ++i) {
		rtems_rbheap_add_to_spare_descriptor_chain(&page_heap,
		    &chunks[i]);
	}

	obj_table = calloc(n, sizeof(*obj_table));

	rtems_bsd_page_area_begin = (uintptr_t)area;
	rtems_bsd_page_object_table = obj_table;
}