summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-07-23 07:02:44 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-07-23 07:02:44 +0000
commit511e155e24fbd21bd028b19de04aeab6b98109df (patch)
tree1e7676e9a9aa5d43a2e905b21ee6c71c84f43f37 /gc.c
parent792b6fd8a221eed71fc1a2328350edc3d167a1cb (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.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/gc.c b/gc.c
index 5cc1f72af0..76c28a34f7 100644
--- a/gc.c
+++ b/gc.c
@@ -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);