summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Patterson <tenderlove@ruby-lang.org>2019-12-17 17:26:11 -0800
committerAaron Patterson <tenderlove@ruby-lang.org>2019-12-18 09:08:25 -0800
commit1e88f6eb95672cae2b0628895a9ee9a5d384e048 (patch)
tree89eb92e455a30213ed554ae96ebb7ffb2c9a8e64
parentefbc0d499c0dc5b74698418c76e58098c6c113e1 (diff)
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.
-rw-r--r--gc.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/gc.c b/gc.c
index f868709cfe..0f9361a03c 100644
--- a/gc.c
+++ b/gc.c
@@ -1710,9 +1710,10 @@ heap_page_add_freeobj(rb_objspace_t *objspace, struct heap_page *page, VALUE obj
}
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);
+ GC_ASSERT(page->free_slots != 0);
if (page->freelist) {
page->free_next = heap->free_pages;
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);
heap_add_page(objspace, heap, page);
- heap_add_freepage(objspace, heap, page);
+ heap_add_freepage(heap, page);
}
static void
@@ -4320,11 +4321,11 @@ gc_sweep_step(rb_objspace_t *objspace, rb_heap_t *heap)
}
}
else {
- heap_add_freepage(objspace, heap, sweep_page);
+ heap_add_freepage(heap, sweep_page);
break;
}
#else
- heap_add_freepage(objspace, heap, sweep_page);
+ heap_add_freepage(heap, sweep_page);
break;
#endif
}
@@ -6271,8 +6272,7 @@ heap_move_pooled_pages_to_free_pages(rb_heap_t *heap)
if (page) {
heap->pooled_pages = page->free_next;
- page->free_next = heap->free_pages;
- heap->free_pages = page;
+ heap_add_freepage(heap, 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;
list_for_each(&heap_eden->pages, page, page_node) {
if (page->free_slots > 0) {
- heap_add_freepage(objspace, heap_eden, page);
+ heap_add_freepage(heap_eden, page);
} else {
page->free_next = NULL;
}