diff options
author | tmm1 <tmm1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-10-04 10:05:37 +0000 |
---|---|---|
committer | tmm1 <tmm1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-10-04 10:05:37 +0000 |
commit | a24705cfa52d14470354600832d129c5b8af64a1 (patch) | |
tree | ca3b0de064ce5a3cc2d514d9c1d90145bfe70c8d /gc.c | |
parent | 0f8032ba2b1cfefdfb19940bfa4033fb739fdfc2 (diff) | |
download | ruby-a24705cfa52d14470354600832d129c5b8af64a1.tar.gz |
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.c | 9 |
1 files changed, 7 insertions, 2 deletions
@@ -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) { |