diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-07-23 07:02:44 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-07-23 07:02:44 +0000 |
commit | 511e155e24fbd21bd028b19de04aeab6b98109df (patch) | |
tree | 1e7676e9a9aa5d43a2e905b21ee6c71c84f43f37 /gc.c | |
parent | 792b6fd8a221eed71fc1a2328350edc3d167a1cb (diff) |
* gc.c (heap_get_freeobj): clear slot->freelist here.
This means that this slot doesn't have any free objects.
And store this slot with objspace->heap.using_slot.
* gc.c (gc_before_sweep): restore objspace->freelist
into objspace->heap.using_slot->freelist.
This means that using_slot has free objects which are
pointed from objspace->freelist.
* gc.c (gc_slot_sweep): do not need to clear slot->freelist.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42131 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 11 |
1 files changed, 9 insertions, 2 deletions
@@ -305,6 +305,7 @@ typedef struct rb_objspace { struct heap_slot *slots; struct heap_slot *sweep_slots; struct heap_slot *free_slots; + struct heap_slot *using_slot; struct heap_slot **sorted; size_t length; size_t used; @@ -933,7 +934,9 @@ heap_get_freeobj(rb_objspace_t *objspace) while (UNLIKELY(p == NULL)) { struct heap_slot *slot = heap_get_freeslot(objspace); + objspace->heap.using_slot = slot; p = objspace->freelist = slot->freelist; + slot->freelist = NULL; } objspace->freelist = p->as.free.next; @@ -2230,7 +2233,6 @@ gc_slot_sweep(rb_objspace_t *objspace, struct heap_slot *sweep_slot) rgengc_report(1, objspace, "slot_sweep: start.\n"); - sweep_slot->freelist = NULL; p = sweep_slot->start; pend = p + sweep_slot->limit; offset = p - NUM_IN_SLOT(p); bits = GET_HEAP_MARK_BITS(p); @@ -2269,7 +2271,6 @@ gc_slot_sweep(rb_objspace_t *objspace, struct heap_slot *sweep_slot) } } else { - heap_slot_add_freeobj(objspace, sweep_slot, (VALUE)p); empty_num++; } } @@ -2340,7 +2341,13 @@ gc_before_sweep(rb_objspace_t *objspace) objspace->heap.sweep_slots = heap_slots; objspace->heap.free_num = 0; objspace->heap.free_slots = NULL; + + if (objspace->heap.using_slot) { + objspace->heap.using_slot->freelist = objspace->freelist; + objspace->heap.using_slot = NULL; + } objspace->freelist = NULL; + malloc_increase2 += ATOMIC_SIZE_EXCHANGE(malloc_increase,0); |