summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authortenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2019-04-20 06:08:54 +0000
committertenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2019-04-20 06:08:54 +0000
commit78d3e4396d3c2ca53875fdbc9a24032d6eebf4f6 (patch)
tree934134a3d5325f5e18c90201ee91d02d6fe8f47c /gc.c
parentc2b8cd425e80ea75c9f3efd8b5b63f1f235b6b54 (diff)
Make sure the has_remembered_objects flag is correctly set
Remembered objects can move between pages, so we need to make sure the flags on the page are set correctly. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67640 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/gc.c b/gc.c
index be61b3dad1..1bb78add2a 100644
--- a/gc.c
+++ b/gc.c
@@ -4655,10 +4655,6 @@ gc_mark_maybe_(rb_objspace_t *objspace, VALUE obj, int pin)
unpoison_object(obj, false);
type = BUILTIN_TYPE(obj);
- if (type == T_MOVED || type == T_ZOMBIE) {
- gc_pin(objspace, obj);
- }
-
/* Garbage can live on the stack, so do not mark or pin */
if (type != T_MOVED && type != T_ZOMBIE && type != T_NONE) {
if (pin) {
@@ -7984,6 +7980,7 @@ gc_ref_update(void *vstart, void *vend, size_t stride, void * data)
page->freelist = NULL;
poison_memory_region(&page->freelist, sizeof(RVALUE*));
page->flags.has_uncollectible_shady_objects = FALSE;
+ page->flags.has_remembered_objects = FALSE;
/* For each object on the page */
for (; v != (VALUE)vend; v += stride) {
@@ -7998,6 +7995,9 @@ gc_ref_update(void *vstart, void *vend, size_t stride, void * data)
if (RVALUE_WB_UNPROTECTED(v)) {
page->flags.has_uncollectible_shady_objects = TRUE;
}
+ if (RVALUE_PAGE_MARKING(page, v)) {
+ page->flags.has_remembered_objects = TRUE;
+ }
gc_update_object_references(objspace, v);
}
}
@@ -8145,6 +8145,7 @@ gc_verify_compaction_references(VALUE mod)
/* Ensure objects are pinned */
rb_gc();
+ rb_gc_disable();
gc_compact_heap(objspace);
@@ -8157,6 +8158,8 @@ gc_verify_compaction_references(VALUE mod)
heap_eden->free_pages = NULL;
heap_eden->using_page = NULL;
+ gc_verify_internal_consistency(mod);
+ rb_gc_enable();
/* GC after compaction to eliminate T_MOVED */
rb_gc();