summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authortarui <tarui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-06-25 16:20:39 +0000
committertarui <tarui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-06-25 16:20:39 +0000
commitb0993c733f9e18a0068dd47b4507f233bb447b82 (patch)
treecb94dc9525c24f9388e3598ae1ecae2727892a3f /gc.c
parent3f44f7f24c1b5e65ba08ac201de23aaa91a8b3b5 (diff)
* gc.c (is_before_sweep): Add new helper function that check the object
is before sweep? * gc.c (rb_gc_force_recycle): Have to clear mark bit if object's slot already ready to mainor sweep. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41633 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/gc.c b/gc.c
index e31602a77d..1f4afb0f00 100644
--- a/gc.c
+++ b/gc.c
@@ -603,6 +603,22 @@ RVALUE_PROMOTE(VALUE obj)
#endif
}
+static inline int
+is_before_sweep(VALUE obj)
+{
+ struct heaps_slot *slot;
+ rb_objspace_t *objspace = &rb_objspace;
+ if (is_lazy_sweeping(objspace)) {
+ slot = objspace->heap.sweep_slots;
+ while (slot) {
+ if(slot->header == GET_HEAP_HEADER(obj))
+ return TRUE;
+ slot = slot->next;
+ }
+ }
+ return FALSE;
+}
+
static inline void
RVALUE_DEMOTE(VALUE obj)
{
@@ -3971,6 +3987,9 @@ rb_gc_force_recycle(VALUE p)
#if USE_RGENGC
CLEAR_IN_BITMAP(GET_HEAP_REMEMBERSET_BITS(p), p);
CLEAR_IN_BITMAP(GET_HEAP_OLDGEN_BITS(p), p);
+ if(!is_before_sweep(p)){
+ CLEAR_IN_BITMAP(GET_HEAP_MARK_BITS(p), p);
+ }
#endif
objspace->total_freed_object_num++;