Project

General

Profile

Feature #1047 » 1047.patch

Patch for issue #1047. - adgar (Michael Edgar), 03/05/2010 05:10 AM

View differences:

gc.c (working copy)
#ifndef GC_MALLOC_LIMIT
#define GC_MALLOC_LIMIT 8000000
#endif
static unsigned int GC_MALLOC_LIMIT_VAL = GC_MALLOC_LIMIT;
#define nomem_error GET_VM()->special_exceptions[ruby_error_nomemory]
......
#define HEAP_MIN_SLOTS 10000
#define FREE_MIN 4096
static unsigned int HEAP_MIN_SLOTS_VAL = HEAP_MIN_SLOTS;
struct gc_list {
VALUE *varptr;
struct gc_list *next;
......
{
rb_objspace_t *objspace = malloc(sizeof(rb_objspace_t));
memset(objspace, 0, sizeof(*objspace));
malloc_limit = GC_MALLOC_LIMIT;
malloc_limit = GC_MALLOC_LIMIT_VAL;
ruby_gc_stress = ruby_initial_gc_stress;
return objspace;
......
{
size_t add, i;
add = HEAP_MIN_SLOTS / HEAP_OBJ_LIMIT;
add = HEAP_MIN_SLOTS_VAL / HEAP_OBJ_LIMIT;
if (!add) {
add = 1;
......
GC_PROF_SET_MALLOC_INFO;
if (malloc_increase > malloc_limit) {
malloc_limit += (size_t)((malloc_increase - malloc_limit) * (double)live / (live + freed));
if (malloc_limit < GC_MALLOC_LIMIT) malloc_limit = GC_MALLOC_LIMIT;
if (malloc_limit < GC_MALLOC_LIMIT_VAL) malloc_limit = GC_MALLOC_LIMIT_VAL;
}
malloc_increase = 0;
if (freed < free_min) {
......
return UINT2NUM((&rb_objspace)->count);
}
/*
* call-seq:
* GC.malloc_limit -> Integer
*
* The size of the malloc limit (minimum heap size).
*
* It returns the bare minimum size of the heap.
*/
static VALUE
gc_malloc_limit_get(VALUE self)
{
rb_objspace_t *objspace = &rb_objspace;
return UINT2NUM(malloc_limit);
}
/*
*
* call-seq:
* GC.malloc_limit = integer -> Integer
*
* Updates the size of the malloc limit (minimum heap size).
*
* It returns the new bare minimum size of the heap.
*/
static VALUE
gc_malloc_limit_set(VALUE self, VALUE new_limit)
{
rb_objspace_t *objspace = &rb_objspace;
malloc_limit = GC_MALLOC_LIMIT_VAL = NUM2UINT(new_limit);
return new_limit;
}
/*
* call-seq:
* GC.heap_min_slots -> Integer
*
* The minimum number of slots in each heap slab.
*
* It returns the number of slots to allocate for each heap slab.
*/
static VALUE
gc_heap_min_slots_get(VALUE self)
{
return UINT2NUM(HEAP_MIN_SLOTS_VAL);
}
/*
*
* call-seq:
* GC.heap_min_slots = integer -> Integer
*
* Updates the minimum number of slots in each heap slab.
*
* It returns the new number of slots to allocate for each heap slab.
*/
static VALUE
gc_heap_min_slots_set(VALUE self, VALUE new_num_slots)
{
HEAP_MIN_SLOTS_VAL = NUM2UINT(new_num_slots);
return new_num_slots;
}
#if CALC_EXACT_MALLOC_SIZE
/*
* call-seq:
......
rb_define_singleton_method(rb_mGC, "stress", gc_stress_get, 0);
rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set, 1);
rb_define_singleton_method(rb_mGC, "count", gc_count, 0);
rb_define_singleton_method(rb_mGC, "malloc_limit", gc_malloc_limit_get, 0);
rb_define_singleton_method(rb_mGC, "malloc_limit=", gc_malloc_limit_set, 1);
rb_define_singleton_method(rb_mGC, "heap_slots", gc_heap_min_slots_get, 0);
rb_define_singleton_method(rb_mGC, "heap_slots=", gc_heap_min_slots_set, 1);
rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0);
rb_mProfiler = rb_define_module_under(rb_mGC, "Profiler");
(1-1/5)