#1805: GC threshold and other values need to be set during configuration
---------------------+------------------------------------------------------
 Reporter:  jkeenan  |       Owner:       
     Type:  todo     |      Status:  new  
 Priority:  normal   |   Milestone:       
Component:  GC       |     Version:  2.8.0
 Severity:  medium   |    Keywords:       
     Lang:           |       Patch:       
 Platform:           |  
---------------------+------------------------------------------------------
 Since the merge of the gc_massacre branch into trunk at r49269, we have
 experienced a number of problems during `make` and `make test`.  These
 have been discussed [http://news.gmane.org/find-
 root.php?message_id=%3ci7ku3k%24a2v%241%40dough.gmane.org%3e on parrot-
 dev] as well as on #parrot.  In the course of this discussion, attention
 was called to the fact that certain values affecting garbage collection
 are hard-coded deep inside ''.c'' source code files.

 As a general rule, it is not a good idea to bury hard-coded values deep
 inside source code.  They should be made available for determination by
 the user during the configuration process.  We need to pull these values
 out of source code and make them more visible during Parrot configuration.

 Here's a GC-amateur's list of GC-related values which appear to be hard-
 coded into our source code:
 {{{
 ./src/gc/gc_ms2.c:626:        self->gc_threshold = 256 * 1024 * 1024;
 ./src/main.c:429:                if (interp->gc_threshold > 1000) {

 src/gc/alloc_resources.c

  26 #define RECLAMATION_FACTOR 0.20
  27 #define WE_WANT_EVER_GROWING_ALLOCATIONS 0
  28
  29 /* show allocated blocks on stderr */
  30 #define RESOURCE_DEBUG 0
  31 #define RESOURCE_DEBUG_SIZE 1000000
 ...
 280 static void
 281 check_fixed_size_obj_pool(ARGIN(const Fixed_Size_Pool *pool))
 282 {
 283     ASSERT_ARGS(check_fixed_size_obj_pool)
 284     size_t total_objects;
 285     size_t last_free_list_count;
 286     Fixed_Size_Arena * arena_walker;
 287     size_t free_objects;
 288     size_t count;
 289     GC_MS_PObj_Wrapper * pobj_walker;
 290
 291     count = 10000000; /*detect unendless loop just use big enough
 number*/
 ...
 328     count = 10000000;
 ...
 357 static void
 358 check_var_size_obj_pool(ARGIN(const Variable_Size_Pool *pool))
 359 {
 360     ASSERT_ARGS(check_var_size_obj_pool)
 361     size_t count;
 362     Memory_Block * block_walker;
 363     count = 10000000; /*detect unendless loop just use big enough
 number*/
 }}}
 We currently have one configuration step, `auto::gc`, which configures
 configuration.  But since we currently only offer users one garbage
 collection system, this step (found in ''config/auto/gc.pm'' doesn't do
 much other than to identify ''src/gc/alloc_resources.c'' as the location
 where GC is determined.  `auto::gc` currently conducts no C probes of the
 user's machine.  It might as well be `init::gc` and its status as an
 'automatic probe' configuration step merely reflects legacy settings.

 (To recap how configuration works (oversimplified): `init::` steps take
 configuration values from Perl 5 `%Config` or other hard-coded locations;
 `inter::` steps work similarly but, on request, will offer the configurer
 several options; `auto` steps calculate settings, largely based on running
 C probes of the user's machine, that should not need user intervention;
 and `gen` steps take all the values discovered in the first three kinds of
 steps and writes Makefiles and other files needed for build and records
 the values in ''lib/Parrot/Config/Generated.pm'' and ''config_lib.pir''.)

 The hard-coded values listed above should, at least in certain cases, be
 user-configurable.  That means that the configuration of garbage
 collection needs to be moved to some combination of `init::`, `inter::`
 and `auto::` steps.  For example, if we determine that on machines with
 'small' physical memory the value of `gc_threshold` needs to be set an
 order of magnitude smaller than 256M, then we need to probe the machine
 for the size of its physical memory, then calculate an appropriate value
 for `gc_threshold`, then provide the user the option of
 confirming/altering this choice at a command-line prompt.

 I can't yet propose specific modifications of the configuration system to
 handle GC values.  But I am convinced that some or all of these values
 need to be extracted from ''.c'' source code files and made explicit
 during configuration.

 Thank you very much.

 kid51

-- 
Ticket URL: <https://trac.parrot.org/parrot/ticket/1805>
Parrot <https://trac.parrot.org/parrot/>
Parrot Development
_______________________________________________
parrot-tickets mailing list
[email protected]
http://lists.parrot.org/mailman/listinfo/parrot-tickets

Reply via email to