summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authortmm1 <tmm1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-10-04 10:05:37 +0000
committertmm1 <tmm1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-10-04 10:05:37 +0000
commita24705cfa52d14470354600832d129c5b8af64a1 (patch)
treeca3b0de064ce5a3cc2d514d9c1d90145bfe70c8d /gc.c
parent0f8032ba2b1cfefdfb19940bfa4033fb739fdfc2 (diff)
gc.c: add rb_objspace.limit
* gc.c: add rb_objspace.limit to keep accurate count of total heap slots [ruby-core:57633] [Bug #8983] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43138 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/gc.c b/gc.c
index 26d02acdeb..b4320ba5bf 100644
--- a/gc.c
+++ b/gc.c
@@ -333,6 +333,7 @@ typedef struct rb_objspace {
struct heap_slot **sorted;
size_t length;
size_t used;
+ size_t limit;
RVALUE *range[2];
size_t free_num;
size_t free_min;
@@ -494,6 +495,7 @@ VALUE *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
#define heap_slots objspace->heap.slots
#define heap_length objspace->heap.length
#define heap_used objspace->heap.used
+#define heap_limit objspace->heap.limit
#define lomem objspace->heap.range[0]
#define himem objspace->heap.range[1]
#define heap_inc objspace->heap.increment
@@ -706,6 +708,7 @@ rb_objspace_free(rb_objspace_t *objspace)
}
free(objspace->heap.sorted);
heap_used = 0;
+ heap_limit = 0;
heap_slots = 0;
}
free_stack_chunks(&objspace->mark_stack);
@@ -824,6 +827,7 @@ heap_assign_slot(rb_objspace_t *objspace)
if (lomem == 0 || lomem > start) lomem = start;
if (himem < end) himem = end;
heap_used++;
+ heap_limit += limit;
for (p = start; p != end; p++) {
rgengc_report(3, objspace, "assign_heap_slot: %p is added to freelist\n");
@@ -2344,6 +2348,7 @@ gc_slot_sweep(rb_objspace_t *objspace, struct heap_slot *sweep_slot)
RDATA(pp)->dmark = (void (*)(void *))(VALUE)sweep_slot;
pp->as.free.flags |= FL_SINGLETON; /* freeing page mark */
}
+ heap_limit -= sweep_slot->limit;
sweep_slot->limit = final_num;
unlink_heap_slot(objspace, sweep_slot);
}
@@ -2377,8 +2382,8 @@ gc_before_sweep(rb_objspace_t *objspace)
{
rgengc_report(1, objspace, "gc_before_sweep\n");
- objspace->heap.do_heap_free = (size_t)((heap_used * HEAP_OBJ_LIMIT) * 0.65);
- objspace->heap.free_min = (size_t)((heap_used * HEAP_OBJ_LIMIT) * 0.2);
+ objspace->heap.do_heap_free = (size_t)(heap_limit * 0.65);
+ objspace->heap.free_min = (size_t)(heap_limit * 0.2);
if (objspace->heap.free_min < initial_free_min) {
objspace->heap.free_min = initial_free_min;
if (objspace->heap.do_heap_free < initial_free_min) {