mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* 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
This commit is contained in:
parent
f46b5bcfaf
commit
9a008c5865
2 changed files with 34 additions and 5 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
Thu Mar 31 15:59:17 2016 Koichi Sasada <ko1@atdot.net>
|
||||||
|
|
||||||
|
* 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 <ko1@atdot.net>
|
Thu Mar 31 15:48:18 2016 Koichi Sasada <ko1@atdot.net>
|
||||||
|
|
||||||
* gc.c (gc_page_sweep): return free slots count.
|
* gc.c (gc_page_sweep): return free slots count.
|
||||||
|
|
29
gc.c
29
gc.c
|
@ -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_shady = FALSE;
|
||||||
unsigned int has_remembered_old = FALSE;
|
unsigned int has_remembered_old = FALSE;
|
||||||
int rememberd_old_objects = 0;
|
int rememberd_old_objects = 0;
|
||||||
|
int free_objects = 0;
|
||||||
|
int zombie_objects = 0;
|
||||||
|
|
||||||
for (i=0; i<page->total_slots; i++) {
|
for (i=0; i<page->total_slots; i++) {
|
||||||
VALUE obj = (VALUE)&page->start[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_UNCOLLECTIBLE(page, obj) && RVALUE_PAGE_WB_UNPROTECTED(page, obj)) has_remembered_shady = TRUE;
|
||||||
if (RVALUE_PAGE_MARKING(page, obj)) {
|
if (RVALUE_PAGE_MARKING(page, obj)) {
|
||||||
has_remembered_old = TRUE;
|
has_remembered_old = TRUE;
|
||||||
|
@ -5096,6 +5100,16 @@ gc_verify_heap_page(rb_objspace_t *objspace, struct heap_page *page, VALUE obj)
|
||||||
page, obj ? obj_info(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;
|
return rememberd_old_objects;
|
||||||
#else
|
#else
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -5103,20 +5117,29 @@ gc_verify_heap_page(rb_objspace_t *objspace, struct heap_page *page, VALUE obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
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;
|
int rememberd_old_objects = 0;
|
||||||
struct heap_page *page = heap_eden->pages;
|
|
||||||
|
|
||||||
while (page) {
|
while (page) {
|
||||||
if (page->flags.has_remembered_objects == FALSE)
|
if (page->flags.has_remembered_objects == FALSE) {
|
||||||
rememberd_old_objects += gc_verify_heap_page(objspace, page, Qfalse);
|
rememberd_old_objects += gc_verify_heap_page(objspace, page, Qfalse);
|
||||||
|
}
|
||||||
page = page->next;
|
page = page->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
return rememberd_old_objects;
|
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:
|
* call-seq:
|
||||||
* GC.verify_internal_consistency -> nil
|
* GC.verify_internal_consistency -> nil
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue