diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-03-31 07:02:40 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-03-31 07:02:40 +0000 |
commit | 9a008c58657a973d9cd1e5b13441f7d099364b22 (patch) | |
tree | 720cfc3ed5546d15fc8e2b125b5bb3475898c947 | |
parent | f46b5bcfaf2c7a905f2e625bd9c44b391b5b40ef (diff) |
* gc.c (gc_verify_heap_page): check the number of zombies.
* gc.c (gc_verify_heap_pages): check also tomb heap.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54448 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | gc.c | 33 |
2 files changed, 34 insertions, 5 deletions
@@ -1,3 +1,9 @@ +Thu Mar 31 15:59:17 2016 Koichi Sasada <[email protected]> + + * gc.c (gc_verify_heap_page): check the number of zombies. + + * gc.c (gc_verify_heap_pages): check also tomb heap. + Thu Mar 31 15:48:18 2016 Koichi Sasada <[email protected]> * gc.c (gc_page_sweep): return free slots count. @@ -5068,9 +5068,13 @@ gc_verify_heap_page(rb_objspace_t *objspace, struct heap_page *page, VALUE obj) unsigned int has_remembered_shady = FALSE; unsigned int has_remembered_old = FALSE; int rememberd_old_objects = 0; + int free_objects = 0; + int zombie_objects = 0; for (i=0; i<page->total_slots; i++) { VALUE obj = (VALUE)&page->start[i]; + if (RBASIC(obj) == 0) free_objects++; + if (BUILTIN_TYPE(obj) == T_ZOMBIE) zombie_objects++; if (RVALUE_PAGE_UNCOLLECTIBLE(page, obj) && RVALUE_PAGE_WB_UNPROTECTED(page, obj)) has_remembered_shady = TRUE; if (RVALUE_PAGE_MARKING(page, obj)) { has_remembered_old = TRUE; @@ -5080,7 +5084,7 @@ gc_verify_heap_page(rb_objspace_t *objspace, struct heap_page *page, VALUE obj) if (!is_incremental_marking(objspace) && page->flags.has_remembered_objects == FALSE && has_remembered_old == TRUE) { - + for (i=0; i<page->total_slots; i++) { VALUE obj = (VALUE)&page->start[i]; if (RVALUE_PAGE_MARKING(page, obj)) { @@ -5096,6 +5100,16 @@ gc_verify_heap_page(rb_objspace_t *objspace, struct heap_page *page, VALUE obj) page, obj ? obj_info(obj) : ""); } + if (0) { + /* free_slots may not equal to free_objects */ + if (page->free_slots != free_objects) { + rb_bug("page %p's free_slots should be %d, but %d\n", page, (int)page->free_slots, free_objects); + } + } + if (page->final_slots != zombie_objects) { + rb_bug("page %p's final_slots should be %d, but %d\n", page, (int)page->final_slots, zombie_objects); + } + return rememberd_old_objects; #else return 0; @@ -5103,20 +5117,29 @@ gc_verify_heap_page(rb_objspace_t *objspace, struct heap_page *page, VALUE obj) } static int -gc_verify_heap_pages(rb_objspace_t *objspace) +gc_verify_heap_pages_(rb_objspace_t *objspace, struct heap_page *page) { int rememberd_old_objects = 0; - struct heap_page *page = heap_eden->pages; while (page) { - if (page->flags.has_remembered_objects == FALSE) - rememberd_old_objects += gc_verify_heap_page(objspace, page, Qfalse); + if (page->flags.has_remembered_objects == FALSE) { + rememberd_old_objects += gc_verify_heap_page(objspace, page, Qfalse); + } page = page->next; } return rememberd_old_objects; } +static int +gc_verify_heap_pages(rb_objspace_t *objspace) +{ + int rememberd_old_objects = 0; + rememberd_old_objects = gc_verify_heap_pages_(objspace, heap_eden->pages); + rememberd_old_objects = gc_verify_heap_pages_(objspace, heap_tomb->pages); + return rememberd_old_objects; +} + /* * call-seq: * GC.verify_internal_consistency -> nil |