From e6b463c5990e7bb6a9ee8ba3d0392960aa7274d3 Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Thu, 6 Mar 2014 15:00:24 +0100 Subject: [PATCH 1/1] Use sensible values for arities of config elements. Closes bug #16538. --- src/instr/instr_config.c | 36 ++++++++++++------------- src/simgrid/sg_config.c | 57 +++++++++++++++++++++------------------- src/xbt/config.c | 14 +++++++--- 3 files changed, 59 insertions(+), 48 deletions(-) diff --git a/src/instr/instr_config.c b/src/instr/instr_config.c index 8fa57c0907..4093e78b79 100644 --- a/src/instr/instr_config.c +++ b/src/instr/instr_config.c @@ -353,110 +353,110 @@ void TRACE_global_init(int *argc, char **argv) /* tracing */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING, "Enable Tracing.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING, "no"); /* register platform in the trace */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_PLATFORM, "Register the platform in the trace as a hierarchy.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_PLATFORM, "no"); /* register platform in the trace */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_TOPOLOGY, "Register the platform topology in the trace as a graph.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_TOPOLOGY, "yes"); /* smpi */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_SMPI, "Tracing of the SMPI interface.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_SMPI, "no"); /* smpi grouped */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_SMPI_GROUP, "Group MPI processes by host.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_SMPI_GROUP, "no"); /* smpi computing */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_SMPI_COMPUTING, "Generate states for timing out of SMPI parts of the application", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_SMPI_COMPUTING, "no"); /* smpi internals */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_SMPI_INTERNALS, "View internal messages sent by Collective communications in SMPI", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_SMPI_INTERNALS, "no"); /* tracing categorized resource utilization traces */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_CATEGORIZED, "Tracing categorized resource utilization of hosts and links.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_CATEGORIZED, "no"); /* tracing uncategorized resource utilization */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_UNCATEGORIZED, "Tracing uncategorized resource utilization of hosts and links.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_UNCATEGORIZED, "no"); /* msg process */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_MSG_PROCESS, "Tracing of MSG process behavior.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_MSG_PROCESS, "no"); /* msg process */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_MSG_VM, "Tracing of MSG process behavior.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_MSG_VM, "no"); /* disable tracing link */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_DISABLE_LINK, "Do not trace link bandwidth and latency.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_DISABLE_LINK, "no"); /* disable tracing link */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_DISABLE_POWER, "Do not trace host power.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_DISABLE_POWER, "no"); /* tracing buffer */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_BUFFER, "Buffer trace events to put them in temporal order.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_BUFFER, "yes"); /* tracing one link only */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_ONELINK_ONLY, "Use only routes with one link to trace platform.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_ONELINK_ONLY, "no"); /* disable destroy */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_DISABLE_DESTROY, "Disable platform containers destruction.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_DISABLE_DESTROY, "no"); /* basic -- Avoid extended events (impoverished trace file) */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_BASIC, "Avoid extended events (impoverished trace file).", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_BASIC, "no"); /* display_sizes -- Extended events with message size information */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_DISPLAY_SIZES, "(smpi only for now) Extended events with message size information", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_DISPLAY_SIZES, "no"); /* format -- Switch the ouput format of Tracing */ diff --git a/src/simgrid/sg_config.c b/src/simgrid/sg_config.c index fa8f4f79ab..37bb10968f 100644 --- a/src/simgrid/sg_config.c +++ b/src/simgrid/sg_config.c @@ -477,7 +477,7 @@ void sg_config_init(int *argc, char **argv) describe_model(description, surf_plugin_description, "plugin", "The plugins"); xbt_cfg_register(&_sg_cfg_set, "plugin", description, - xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__plugin, NULL); + xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__plugin, NULL); describe_model(description, surf_cpu_model_description, "model", "The model to use for the CPU"); @@ -538,7 +538,8 @@ void sg_config_init(int *argc, char **argv) xbt_cfg_register(&_sg_cfg_set, "network/sender_gap", "Minimum gap between two overlapping sends", xbt_cfgelm_double, 1, 1, _sg_cfg_cb__sender_gap, NULL); - /* default for "network/sender_gap" is set in network.c */ + /* real default for "network/sender_gap" is set in network_smpi.cpp */ + xbt_cfg_setdefault_double(_sg_cfg_set, "network/sender_gap", NAN); xbt_cfg_register(&_sg_cfg_set, "network/latency_factor", "Correction factor to apply to the provided latency (default value set by network model)", @@ -553,78 +554,79 @@ void sg_config_init(int *argc, char **argv) xbt_cfg_register(&_sg_cfg_set, "network/weight_S", "Correction factor to apply to the weight of competing streams (default value set by network model)", xbt_cfgelm_double, 1, 1, _sg_cfg_cb__weight_S, NULL); - /* default for "network/weight_S" is set in network.c */ + /* real default for "network/weight_S" is set in network_*.cpp */ + xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", NAN); /* Inclusion path */ xbt_cfg_register(&_sg_cfg_set, "path", "Lookup path for inclusions in platform and deployment XML files", - xbt_cfgelm_string, 0, 0, _sg_cfg_cb__surf_path, NULL); + xbt_cfgelm_string, 1, 0, _sg_cfg_cb__surf_path, NULL); xbt_cfg_register(&_sg_cfg_set, "cpu/maxmin_selective_update", "Update the constraint set propagating recursively to others constraints (off by default when optim is set to lazy)", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, "cpu/maxmin_selective_update", "no"); xbt_cfg_register(&_sg_cfg_set, "network/maxmin_selective_update", "Update the constraint set propagating recursively to others constraints (off by default when optim is set to lazy)", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, "network/maxmin_selective_update", "no"); #ifdef HAVE_MC /* do model-checking */ xbt_cfg_register(&_sg_cfg_set, "model-check", "Verify the system through model-checking instead of simulating it (EXPERIMENTAL)", - xbt_cfgelm_boolean, 0, 1, _sg_cfg_cb_model_check, NULL); + xbt_cfgelm_boolean, 1, 1, _sg_cfg_cb_model_check, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, "model-check", "no"); /* do stateful model-checking */ xbt_cfg_register(&_sg_cfg_set, "model-check/checkpoint", "Specify the amount of steps between checkpoints during stateful model-checking (default: 0 => stateless verification). " "If value=1, one checkpoint is saved for each step => faster verification, but huge memory consumption; higher values are good compromises between speed and memory consumption.", - xbt_cfgelm_int, 0, 1, _mc_cfg_cb_checkpoint, NULL); + xbt_cfgelm_int, 1, 1, _mc_cfg_cb_checkpoint, NULL); xbt_cfg_setdefault_int(_sg_cfg_set, "model-check/checkpoint", 0); /* do liveness model-checking */ xbt_cfg_register(&_sg_cfg_set, "model-check/property", "Specify the name of the file containing the property. It must be the result of the ltl2ba program.", - xbt_cfgelm_string, 0, 1, _mc_cfg_cb_property, NULL); + xbt_cfgelm_string, 1, 1, _mc_cfg_cb_property, NULL); xbt_cfg_setdefault_string(_sg_cfg_set, "model-check/property", ""); /* Specify the kind of model-checking reduction */ xbt_cfg_register(&_sg_cfg_set, "model-check/reduction", "Specify the kind of exploration reduction (either none or DPOR)", - xbt_cfgelm_string, 0, 1, _mc_cfg_cb_reduce, NULL); + xbt_cfgelm_string, 1, 1, _mc_cfg_cb_reduce, NULL); xbt_cfg_setdefault_string(_sg_cfg_set, "model-check/reduction", "dpor"); /* Enable/disable timeout for wait requests with model-checking */ xbt_cfg_register(&_sg_cfg_set, "model-check/timeout", "Enable/Disable timeout for wait requests", - xbt_cfgelm_boolean, 0, 1, _mc_cfg_cb_timeout, NULL); + xbt_cfgelm_boolean, 1, 1, _mc_cfg_cb_timeout, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, "model-check/timeout", "no"); /* Set max depth exploration */ xbt_cfg_register(&_sg_cfg_set, "model-check/max_depth", "Specify the max depth of exploration (default : 1000)", - xbt_cfgelm_int, 0, 1, _mc_cfg_cb_max_depth, NULL); + xbt_cfgelm_int, 1, 1, _mc_cfg_cb_max_depth, NULL); xbt_cfg_setdefault_int(_sg_cfg_set, "model-check/max_depth", 1000); /* Set number of visited state stored for state comparison reduction*/ xbt_cfg_register(&_sg_cfg_set, "model-check/visited", "Specify the number of visited state stored for state comparison reduction. If value=5, the last 5 visited states are stored", - xbt_cfgelm_int, 0, 1, _mc_cfg_cb_visited, NULL); + xbt_cfgelm_int, 1, 1, _mc_cfg_cb_visited, NULL); xbt_cfg_setdefault_int(_sg_cfg_set, "model-check/visited", 0); /* Set file name for dot output of graph state */ xbt_cfg_register(&_sg_cfg_set, "model-check/dot_output", "Specify the name of dot file corresponding to graph state", - xbt_cfgelm_string, 0, 1, _mc_cfg_cb_dot_output, NULL); + xbt_cfgelm_string, 1, 1, _mc_cfg_cb_dot_output, NULL); xbt_cfg_setdefault_string(_sg_cfg_set, "model-check/dot_output", ""); #endif /* do verbose-exit */ xbt_cfg_register(&_sg_cfg_set, "verbose-exit", "Activate the \"do nothing\" mode in Ctrl-C", - xbt_cfgelm_boolean, 0, 1, _sg_cfg_cb_verbose_exit, NULL); + xbt_cfgelm_boolean, 1, 1, _sg_cfg_cb_verbose_exit, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, "verbose-exit", "yes"); /* context factory */ @@ -685,7 +687,7 @@ void sg_config_init(int *argc, char **argv) xbt_cfg_register(&_sg_cfg_set, "network/crosstraffic", "Activate the interferences between uploads and downloads for fluid max-min models (LV08, CM02)", - xbt_cfgelm_boolean, 0, 1, _sg_cfg_cb__surf_network_crosstraffic, NULL); + xbt_cfgelm_boolean, 1, 1, _sg_cfg_cb__surf_network_crosstraffic, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, "network/crosstraffic", "no"); #ifdef HAVE_GTNETS @@ -777,47 +779,47 @@ void sg_config_init(int *argc, char **argv) xbt_cfg_register(&_sg_cfg_set, "smpi/gather", "Which collective to use for gather", - xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_gather, NULL); + xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_gather, NULL); xbt_cfg_register(&_sg_cfg_set, "smpi/allgather", "Which collective to use for allgather", - xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_allgather, NULL); + xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_allgather, NULL); xbt_cfg_register(&_sg_cfg_set, "smpi/barrier", "Which collective to use for barrier", - xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_barrier, NULL); + xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_barrier, NULL); xbt_cfg_register(&_sg_cfg_set, "smpi/reduce_scatter", "Which collective to use for reduce_scatter", - xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_reduce_scatter, NULL); + xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_reduce_scatter, NULL); xbt_cfg_register(&_sg_cfg_set, "smpi/scatter", "Which collective to use for scatter", - xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_scatter, NULL); + xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_scatter, NULL); xbt_cfg_register(&_sg_cfg_set, "smpi/allgatherv", "Which collective to use for allgatherv", - xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_allgatherv, NULL); + xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_allgatherv, NULL); xbt_cfg_register(&_sg_cfg_set, "smpi/allreduce", "Which collective to use for allreduce", - xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_allreduce, NULL); + xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_allreduce, NULL); xbt_cfg_register(&_sg_cfg_set, "smpi/alltoall", "Which collective to use for alltoall", - xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_alltoall, NULL); + xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_alltoall, NULL); xbt_cfg_register(&_sg_cfg_set, "smpi/alltoallv", "Which collective to use for alltoallv", - xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_alltoallv, NULL); + xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_alltoallv, NULL); xbt_cfg_register(&_sg_cfg_set, "smpi/bcast", "Which collective to use for bcast", - xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_bcast, NULL); + xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_bcast, NULL); xbt_cfg_register(&_sg_cfg_set, "smpi/reduce", "Which collective to use for reduce", - xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_reduce, NULL); + xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_reduce, NULL); #endif // HAVE_SMPI xbt_cfg_register(&_sg_cfg_set, "clean_atexit", @@ -835,6 +837,7 @@ void sg_config_init(int *argc, char **argv) xbt_cfg_setdefault_string(_sg_cfg_set, "path", initial_path); } + xbt_cfg_check(_sg_cfg_set); _sg_cfg_init_status = 1; sg_config_cmd_line(argc, argv); diff --git a/src/xbt/config.c b/src/xbt/config.c index 0eb3145b86..49667ddf5e 100644 --- a/src/xbt/config.c +++ b/src/xbt/config.c @@ -380,10 +380,11 @@ void xbt_cfg_help(xbt_cfg_t cfg) printf(" %s: %s\n", name, variable->desc); printf(" Type: %s; ", xbt_cfgelm_type_name[variable->type]); if (variable->min != 1 || variable->max != 1) { - if (variable->min == 0 && variable->max == 0) - printf("Arity: no bound; "); + printf("Arity: min:%d to max:", variable->min); + if (variable->max == 0) + printf("(no bound); "); else - printf("Arity: min:%d to max:%d; ", variable->min, variable->max); + printf("%d; ", variable->max); } size = xbt_dynar_length(variable->content); printf("Current value%s: ", (size <= 1 ? "" : "s")); @@ -453,6 +454,13 @@ void xbt_cfg_check(xbt_cfg_t cfg) size); } + if (variable->isdefault && size > variable->min) { + xbt_dict_cursor_free(&cursor); + THROWF(mismatch_error, 0, + "Config elem %s theoretically accepts %d %s, but has a default of %d values.", + name, variable->min, xbt_cfgelm_type_name[variable->type], size); + } + if (variable->max > 0 && variable->max < size) { xbt_dict_cursor_free(&cursor); THROWF(mismatch_error, 0, -- 2.20.1