aboutsummaryrefslogtreecommitdiffstats
path: root/gc.c
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-03-31 07:02:40 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-03-31 07:02:40 +0000
commit9a008c58657a973d9cd1e5b13441f7d099364b22 (patch)
tree720cfc3ed5546d15fc8e2b125b5bb3475898c947 /gc.c
parentf46b5bcfaf2c7a905f2e625bd9c44b391b5b40ef (diff)
downloadruby-9a008c58657a973d9cd1e5b13441f7d099364b22.tar.gz
* 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
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c33
1 files changed, 28 insertions, 5 deletions
diff --git a/gc.c b/gc.c
index d8f2adb831..1bd3efbfcc 100644
--- a/gc.c
+++ b/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_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