Skip to content

Commit

Permalink
* gc.c (is_before_sweep): Add new helper function that check the object
Browse files Browse the repository at this point in the history
	  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
  • Loading branch information
tarui committed Jun 25, 2013
1 parent 3f44f7f commit b0993c7
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 0 deletions.
7 changes: 7 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
Wed Jun 26 01:18:13 2013 Masaya Tarui <[email protected]>

* 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.

Wed Jun 26 01:17:29 2013 Tanaka Akira <[email protected]>

* bignum.c (bigsub_int): Fix a buffer over read.
Expand Down
19 changes: 19 additions & 0 deletions gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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++;
Expand Down

0 comments on commit b0993c7

Please sign in to comment.