static void fragment_list_split (SgenFragmentAllocator *allocator) { SgenFragment *prev = NULL, *list = allocator->region_head; while (list) { if (list->fragment_end > promotion_barrier) { if (list->fragment_start < promotion_barrier) { SgenFragment *res = sgen_fragment_allocator_alloc (); res->fragment_start = promotion_barrier; res->fragment_next = promotion_barrier; res->fragment_end = list->fragment_end; res->next = list->next; res->next_in_order = list->next_in_order; g_assert (res->fragment_end > res->fragment_start); list->fragment_end = promotion_barrier; list->next = list->next_in_order = NULL; allocator->region_head = allocator->alloc_head = res; return; } else { if (prev) prev->next = prev->next_in_order = NULL; allocator->region_head = allocator->alloc_head = list; return; } } prev = list; list = list->next; } allocator->region_head = allocator->alloc_head = NULL; }
void sgen_fragment_allocator_add (SgenFragmentAllocator *allocator, char *start, char *end) { SgenFragment *fragment; fragment = sgen_fragment_allocator_alloc (); fragment->fragment_start = start; fragment->fragment_next = start; fragment->fragment_end = end; fragment->next_in_order = fragment->next = (SgenFragment *)unmask (allocator->region_head); allocator->region_head = allocator->alloc_head = fragment; g_assert (fragment->fragment_end > fragment->fragment_start); }