Feature #1047 » patch-1.9.2-gc.patch
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);
|
||
}
|
||