ruby-changes:27694
From: nari <ko1@a...>
Date: Wed, 13 Mar 2013 23:55:45 +0900 (JST)
Subject: [ruby-changes:27694] nari:r39746 (trunk): * gc.c: allow to tune growth of heap by environment variable
nari 2013-03-13 23:52:00 +0900 (Wed, 13 Mar 2013) New Revision: 39746 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=39746 Log: * gc.c: allow to tune growth of heap by environment variable RUBY_HEAP_SLOTS_GROWTH_FACTOR. patched by tmm1(Aman Gupta). [Feature #8015] [ruby-core:53131] Modified files: trunk/ChangeLog trunk/gc.c trunk/test/ruby/test_gc.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 39745) +++ ChangeLog (revision 39746) @@ -1,3 +1,9 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Wed Mar 13 23:25:59 2013 Narihiro Nakamura <authornari@g...> + + * gc.c: allow to tune growth of heap by environment variable + RUBY_HEAP_SLOTS_GROWTH_FACTOR. patched by tmm1(Aman Gupta). + [Feature #8015] [ruby-core:53131] + Wed Mar 13 19:43:46 2013 Kazuhiro NISHIYAMA <zn@m...> * doc/irb/irb.rd.ja: fix typo Index: gc.c =================================================================== --- gc.c (revision 39745) +++ gc.c (revision 39746) @@ -71,11 +71,13 @@ https://github.com/ruby/ruby/blob/trunk/gc.c#L71 #endif #define HEAP_MIN_SLOTS 10000 #define FREE_MIN 4096 +#define HEAP_GROWTH_FACTOR 1.8 typedef struct { unsigned int initial_malloc_limit; unsigned int initial_heap_min_slots; unsigned int initial_free_min; + double initial_growth_factor; #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE int gc_stress; #endif @@ -85,6 +87,7 @@ static ruby_gc_params_t initial_params = https://github.com/ruby/ruby/blob/trunk/gc.c#L87 GC_MALLOC_LIMIT, HEAP_MIN_SLOTS, FREE_MIN, + HEAP_GROWTH_FACTOR, #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE FALSE, #endif @@ -287,6 +290,7 @@ int *ruby_initial_gc_stress_ptr = &rb_ob https://github.com/ruby/ruby/blob/trunk/gc.c#L290 #define initial_malloc_limit initial_params.initial_malloc_limit #define initial_heap_min_slots initial_params.initial_heap_min_slots #define initial_free_min initial_params.initial_free_min +#define initial_growth_factor initial_params.initial_growth_factor #define is_lazy_sweeping(objspace) ((objspace)->heap.sweep_slots != 0) @@ -605,7 +609,7 @@ initial_expand_heap(rb_objspace_t *objsp https://github.com/ruby/ruby/blob/trunk/gc.c#L609 static void set_heaps_increment(rb_objspace_t *objspace) { - size_t next_heaps_length = (size_t)(heaps_used * 1.8); + size_t next_heaps_length = (size_t)(heaps_used * initial_growth_factor); if (next_heaps_length == heaps_used) { next_heaps_length++; @@ -3290,7 +3294,7 @@ rb_gc_disable(void) https://github.com/ruby/ruby/blob/trunk/gc.c#L3294 void rb_gc_set_params(void) { - char *malloc_limit_ptr, *heap_min_slots_ptr, *free_min_ptr; + char *malloc_limit_ptr, *heap_min_slots_ptr, *free_min_ptr, *growth_factor_ptr; if (rb_safe_level() > 0) return; @@ -3317,6 +3321,17 @@ rb_gc_set_params(void) https://github.com/ruby/ruby/blob/trunk/gc.c#L3321 } } + growth_factor_ptr = getenv("RUBY_HEAP_SLOTS_GROWTH_FACTOR"); + if (growth_factor_ptr != NULL) { + double growth_factor_f = strtod(growth_factor_ptr, NULL); + if (RTEST(ruby_verbose)) + fprintf(stderr, "heap_slots_growth_factor=%f (%f)\n", + growth_factor_f, initial_growth_factor); + if (growth_factor_f > 1) { + initial_growth_factor = growth_factor_f; + } + } + free_min_ptr = getenv("RUBY_FREE_MIN"); if (free_min_ptr != NULL) { int free_min_i = atoi(free_min_ptr); Index: test/ruby/test_gc.rb =================================================================== --- test/ruby/test_gc.rb (revision 39745) +++ test/ruby/test_gc.rb (revision 39746) @@ -108,6 +108,12 @@ class TestGc < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_gc.rb#L108 assert_in_out_err([env, "-W0", "-e", "exit"], "", [], [], "[ruby-core:39795]") assert_in_out_err([env, "-W1", "-e", "exit"], "", [], [], "[ruby-core:39795]") assert_in_out_err([env, "-w", "-e", "exit"], "", [], /heap_min_slots=100000/, "[ruby-core:39795]") + + env = { + "RUBY_HEAP_SLOTS_GROWTH_FACTOR" => "2.0" + } + assert_normal_exit("exit", "", :child_env => env) + assert_in_out_err([env, "-w", "-e", "exit"], "", [], /heap_slots_growth_factor=2.0/, "") end def test_profiler_enabled -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/