summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authortarui <tarui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-11-01 13:47:39 +0000
committertarui <tarui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-11-01 13:47:39 +0000
commit21a58208f1342b9373aaab14e70c675461e1e764 (patch)
tree0612e435c11fffbf77a9f86364f90a7a1cbad284 /gc.c
parent99981ece007f613e702dbc7b30261a147d4bf9e0 (diff)
* 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
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c34
1 files changed, 10 insertions, 24 deletions
diff --git a/gc.c b/gc.c
index d0d49065fa..6bc362b994 100644
--- a/gc.c
+++ b/gc.c
@@ -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