Refactor free page insertion
I am trying to fix this error: http://ci.rvm.jp/results/trunk-gc_compact@silicon-docker/2491596 Somehow we have a page in the `free_pages` list that is full. This commit refactors the code so that any time we add a page to the `free_pages` list, we do it via `heap_add_freepage`. That function then asserts that the free slots on that page are not 0.
This commit is contained in:
parent
efbc0d499c
commit
1e88f6eb95
14
gc.c
14
gc.c
@ -1710,9 +1710,10 @@ heap_page_add_freeobj(rb_objspace_t *objspace, struct heap_page *page, VALUE obj
|
|||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
heap_add_freepage(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *page)
|
heap_add_freepage(rb_heap_t *heap, struct heap_page *page)
|
||||||
{
|
{
|
||||||
asan_unpoison_memory_region(&page->freelist, sizeof(RVALUE*), false);
|
asan_unpoison_memory_region(&page->freelist, sizeof(RVALUE*), false);
|
||||||
|
GC_ASSERT(page->free_slots != 0);
|
||||||
if (page->freelist) {
|
if (page->freelist) {
|
||||||
page->free_next = heap->free_pages;
|
page->free_next = heap->free_pages;
|
||||||
heap->free_pages = page;
|
heap->free_pages = page;
|
||||||
@ -1920,7 +1921,7 @@ heap_assign_page(rb_objspace_t *objspace, rb_heap_t *heap)
|
|||||||
{
|
{
|
||||||
struct heap_page *page = heap_page_create(objspace);
|
struct heap_page *page = heap_page_create(objspace);
|
||||||
heap_add_page(objspace, heap, page);
|
heap_add_page(objspace, heap, page);
|
||||||
heap_add_freepage(objspace, heap, page);
|
heap_add_freepage(heap, page);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -4320,11 +4321,11 @@ gc_sweep_step(rb_objspace_t *objspace, rb_heap_t *heap)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
heap_add_freepage(objspace, heap, sweep_page);
|
heap_add_freepage(heap, sweep_page);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
heap_add_freepage(objspace, heap, sweep_page);
|
heap_add_freepage(heap, sweep_page);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -6271,8 +6272,7 @@ heap_move_pooled_pages_to_free_pages(rb_heap_t *heap)
|
|||||||
|
|
||||||
if (page) {
|
if (page) {
|
||||||
heap->pooled_pages = page->free_next;
|
heap->pooled_pages = page->free_next;
|
||||||
page->free_next = heap->free_pages;
|
heap_add_freepage(heap, page);
|
||||||
heap->free_pages = page;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return page;
|
return page;
|
||||||
@ -8576,7 +8576,7 @@ gc_compact_after_gc(rb_objspace_t *objspace, int use_toward_empty, int use_doubl
|
|||||||
struct heap_page *page = NULL;
|
struct heap_page *page = NULL;
|
||||||
list_for_each(&heap_eden->pages, page, page_node) {
|
list_for_each(&heap_eden->pages, page, page_node) {
|
||||||
if (page->free_slots > 0) {
|
if (page->free_slots > 0) {
|
||||||
heap_add_freepage(objspace, heap_eden, page);
|
heap_add_freepage(heap_eden, page);
|
||||||
} else {
|
} else {
|
||||||
page->free_next = NULL;
|
page->free_next = NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user