Project

General

Profile

Feature #1047 » patch-1.9.2-gc.patch

patch for setting GC parameters from environment variables - funny_falcon (Yura Sokolov), 03/06/2011 04:38 PM

View differences:

gc.c
#ifndef GC_MALLOC_LIMIT
#define GC_MALLOC_LIMIT 8000000
#endif
#define HEAP_MIN_SLOTS 10000
#define FREE_MIN 4096
static unsigned int initial_malloc_limit = GC_MALLOC_LIMIT;
static unsigned int initial_heap_min_slots = HEAP_MIN_SLOTS;
static unsigned int initial_free_min = FREE_MIN;
static void set_gc_parameters()
{
char *malloc_limit_ptr, *heap_min_slots_ptr, *free_min_ptr;
malloc_limit_ptr = getenv("RUBY_GC_MALLOC_LIMIT");
if ( malloc_limit_ptr != NULL ) {
int malloc_limit_i = atoi(malloc_limit_ptr);
if ( malloc_limit_i > 0 ) {
initial_malloc_limit = malloc_limit_i;
}
}
heap_min_slots_ptr = getenv("RUBY_HEAP_MIN_SLOTS");
if ( heap_min_slots_ptr != NULL ) {
int heap_min_slots_i = atoi(heap_min_slots_ptr);
if ( heap_min_slots_i > 0 ) {
initial_heap_min_slots = heap_min_slots_i;
}
}
free_min_ptr = getenv("RUBY_FREE_MIN");
if ( free_min_ptr != NULL ) {
int free_min_i = atoi(free_min_ptr);
if ( free_min_i > 0 ) {
initial_free_min = free_min_i;
}
}
}
#define nomem_error GET_VM()->special_exceptions[ruby_error_nomemory]
......
int finalize_flag;
};
#define HEAP_MIN_SLOTS 10000
#define FREE_MIN 4096
struct gc_list {
VALUE *varptr;
struct gc_list *next;
......
static int ruby_initial_gc_stress = 0;
int *ruby_initial_gc_stress_ptr = &ruby_initial_gc_stress;
#else
static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT}, {HEAP_MIN_SLOTS}};
static rb_objspace_t rb_objspace = {{initial_malloc_limit}, {initial_heap_min_slots}};
int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
#endif
#define malloc_limit objspace->malloc_params.limit
......
{
rb_objspace_t *objspace = malloc(sizeof(rb_objspace_t));
memset(objspace, 0, sizeof(*objspace));
malloc_limit = GC_MALLOC_LIMIT;
malloc_limit = initial_malloc_limit;
ruby_gc_stress = ruby_initial_gc_stress;
return objspace;
......
{
size_t add, i;
add = HEAP_MIN_SLOTS / HEAP_OBJ_LIMIT;
add = initial_heap_min_slots / HEAP_OBJ_LIMIT;
if (!add) {
add = 1;
......
do_heap_free = (size_t)((heaps_used * HEAP_OBJ_LIMIT) * 0.65);
free_min = (size_t)((heaps_used * HEAP_OBJ_LIMIT) * 0.2);
if (free_min < FREE_MIN) {
if (free_min < initial_free_min) {
do_heap_free = heaps_used * HEAP_OBJ_LIMIT;
free_min = FREE_MIN;
free_min = initial_free_min;
}
freelist = 0;
......
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 < initial_malloc_limit) malloc_limit = initial_malloc_limit;
}
malloc_increase = 0;
if (freed < free_min) {
......
void
Init_heap(void)
{
set_gc_parameters();
init_heap(&rb_objspace);
}
(3-3/5)