diff options
author | tarui <tarui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-11-01 13:47:39 +0000 |
---|---|---|
committer | tarui <tarui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-11-01 13:47:39 +0000 |
commit | 21a58208f1342b9373aaab14e70c675461e1e764 (patch) | |
tree | 0612e435c11fffbf77a9f86364f90a7a1cbad284 | |
parent | 99981ece007f613e702dbc7b30261a147d4bf9e0 (diff) | |
download | ruby-21a58208f1342b9373aaab14e70c675461e1e764.tar.gz |
* gc.c (struct heap_page, gc_page_sweep, gc_sweep): Refactoring for
performance. Add before_sweep condition to heap_page structure.
* gc.c (rb_gc_force_recycle): Use before_sweep member.
* gc.c (heap_is_before_sweep, is_before_sweep): Remove. They has not
already been used.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43508 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | gc.c | 34 |
2 files changed, 20 insertions, 24 deletions
@@ -1,3 +1,13 @@ +Fri Nov 1 22:45:54 2013 Masaya Tarui <tarui@ruby-lang.org> + + * gc.c (struct heap_page, gc_page_sweep, gc_sweep): Refactoring for + performance. Add before_sweep condition to heap_page structure. + + * gc.c (rb_gc_force_recycle): Use before_sweep member. + + * gc.c (heap_is_before_sweep, is_before_sweep): Remove. They has not + already been used. + Fri Nov 1 22:20:28 2013 Masaya Tarui <tarui@ruby-lang.org> * gc.c (make_deferred): Refactoring. Collect codes which should be @@ -474,6 +474,7 @@ struct heap_page { struct heap_page *prev; struct heap_page *free_next; rb_heap_t *heap; + int before_sweep; bits_t mark_bits[HEAP_BITMAP_LIMIT]; #if USE_RGENGC @@ -666,29 +667,6 @@ RVALUE_PROMOTE(VALUE obj) #endif } -static inline int -heap_is_before_sweep(VALUE obj, rb_heap_t *heap) -{ - struct heap_page *page; - if (is_lazy_sweeping(heap)) { - page = heap->sweep_pages; - while (page) { - if (page->body == GET_PAGE_BODY(obj)) { - return TRUE; - } - page = page->next; - } - } - return FALSE; -} - -static inline int -is_before_sweep(VALUE obj) -{ - rb_objspace_t *objspace = &rb_objspace; - return heap_is_before_sweep(obj, heap_eden); -} - static inline void RVALUE_DEMOTE(VALUE obj) { @@ -2383,6 +2361,8 @@ gc_page_sweep(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *sweep_ rgengc_report(1, objspace, "page_sweep: start.\n"); + sweep_page->before_sweep = 0; + p = sweep_page->start; pend = p + sweep_page->limit; offset = p - NUM_IN_PAGE(p); bits = GET_HEAP_MARK_BITS(p); @@ -2664,7 +2644,13 @@ gc_sweep(rb_objspace_t *objspace, int immediate_sweep) #endif } else { + struct heap_page *page; gc_before_sweep(objspace); + page = heap_eden->sweep_pages; + while (page) { + page->before_sweep = 1; + page = page->next; + } gc_heap_lazy_sweep(objspace, heap_eden); } @@ -4295,7 +4281,7 @@ 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)) { + if (!GET_HEAP_PAGE(p)->before_sweep) { CLEAR_IN_BITMAP(GET_HEAP_MARK_BITS(p), p); } #endif |