X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/a35265d3c8fa860614bab6b7a438ad0cc2803e79..281f8c29e177852dcb1591fc31e363e1176857c8:/src/simgrid/sg_config.c diff --git a/src/simgrid/sg_config.c b/src/simgrid/sg_config.c index 34e5b43f32..11cf929659 100644 --- a/src/simgrid/sg_config.c +++ b/src/simgrid/sg_config.c @@ -35,6 +35,12 @@ xbt_cfg_t _sg_cfg_set = NULL; */ int _sg_cfg_init_status = 0; +/* instruct the upper layer (simix or simdag) to exit as soon as possible + */ +int _sg_cfg_exit_asap = 0; + +#define sg_cfg_exit_early() do { _sg_cfg_exit_asap = 1; return; } while (0) + /* Parse the command line, looking for options */ static void sg_config_cmd_line(int *argc, char **argv) { @@ -49,6 +55,9 @@ static void sg_config_cmd_line(int *argc, char **argv) xbt_cfg_set_parse(_sg_cfg_set, opt); XBT_DEBUG("Did apply '%s' as config setting", opt); + } else if (!strcmp(argv[i], "--version")) { + printf("%s\n", SIMGRID_VERSION_STRING); + shall_exit = 1; } else if (!strcmp(argv[i], "--cfg-help") || !strcmp(argv[i], "--help")) { printf ("Description of the configuration accepted by this simulator:\n"); @@ -65,6 +74,8 @@ static void sg_config_cmd_line(int *argc, char **argv) #endif "\n" "You can also use --help-logs and --help-log-categories to see the details of logging output.\n" +"\n" +"You can also use --version to get SimGrid version information.\n" "\n" ); shall_exit = 1; @@ -96,10 +107,8 @@ static void sg_config_cmd_line(int *argc, char **argv) argv[j] = NULL; *argc = j; } - if (shall_exit) { - _sg_cfg_init_status = 1; // get everything cleanly cleaned on exit - exit(0); - } + if (shall_exit) + sg_cfg_exit_early(); } /* callback of the workstation/model variable */ @@ -114,13 +123,32 @@ static void _sg_cfg_cb__workstation_model(const char *name, int pos) if (!strcmp(val, "help")) { model_help("workstation", surf_workstation_model_description); - exit(0); + sg_cfg_exit_early(); } /* Make sure that the model exists */ find_model_description(surf_workstation_model_description, val); } +/* callback of the vm_workstation/model variable */ +static void _sg_cfg_cb__vm_workstation_model(const char *name, int pos) +{ + char *val; + + xbt_assert(_sg_cfg_init_status < 2, + "Cannot change the model after the initialization"); + + val = xbt_cfg_get_string(_sg_cfg_set, name); + + if (!strcmp(val, "help")) { + model_help("vm_workstation", surf_vm_workstation_model_description); + sg_cfg_exit_early(); + } + + /* Make sure that the model exists */ + find_model_description(surf_vm_workstation_model_description, val); +} + /* callback of the cpu/model variable */ static void _sg_cfg_cb__cpu_model(const char *name, int pos) { @@ -133,7 +161,7 @@ static void _sg_cfg_cb__cpu_model(const char *name, int pos) if (!strcmp(val, "help")) { model_help("CPU", surf_cpu_model_description); - exit(0); + sg_cfg_exit_early(); } /* New Module missing */ @@ -152,7 +180,7 @@ static void _sg_cfg_cb__optimization_mode(const char *name, int pos) if (!strcmp(val, "help")) { model_help("optimization", surf_optimization_mode_description); - exit(0); + sg_cfg_exit_early(); } /* New Module missing */ @@ -171,7 +199,7 @@ static void _sg_cfg_cb__storage_mode(const char *name, int pos) if (!strcmp(val, "help")) { model_help("storage", surf_storage_model_description); - exit(0); + sg_cfg_exit_early(); } /* New Module missing */ @@ -190,7 +218,7 @@ static void _sg_cfg_cb__network_model(const char *name, int pos) if (!strcmp(val, "help")) { model_help("network", surf_network_model_description); - exit(0); + sg_cfg_exit_early(); } /* New Module missing */ @@ -243,7 +271,7 @@ static void _sg_cfg_cb__coll(const char *category, if (!strcmp(val, "help")) { coll_help(category, table); - exit(0); + sg_cfg_exit_early(); } /* New Module missing */ @@ -401,7 +429,8 @@ static void _sg_cfg_cb__gtnets_jitter_seed(const char *name, int pos) /* create the config set, register what should be and parse the command line*/ void sg_config_init(int *argc, char **argv) { - char *description = xbt_malloc(1024), *p = description; + char *description = xbt_malloc(1024); + char *p; int i; /* Create the configuration support */ @@ -442,22 +471,6 @@ void sg_config_init(int *argc, char **argv) xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__storage_mode, NULL); xbt_cfg_setdefault_string(_sg_cfg_set, "storage/model", "default"); - /* ********************************************************************* */ - /* TUTORIAL: New model */ - sprintf(description, - "The model to use for the New model. Possible values: "); - p = description; - while (*(++p) != '\0'); - for (i = 0; surf_new_model_description[i].name; i++) - p += sprintf(p, "%s%s", (i == 0 ? "" : ", "), - surf_new_model_description[i].name); - sprintf(p, - ".\n (use 'help' as a value to see the long description of each model)"); - xbt_cfg_register(&_sg_cfg_set, "new_model/model", description, - xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__storage_mode, NULL); - xbt_cfg_setdefault_string(_sg_cfg_set, "new_model/model", "default"); - /* ********************************************************************* */ - sprintf(description, "The model to use for the network. Possible values: "); p = description; @@ -497,6 +510,10 @@ void sg_config_init(int *argc, char **argv) xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__workstation_model, NULL); xbt_cfg_setdefault_string(_sg_cfg_set, "workstation/model", "default"); + xbt_cfg_register(&_sg_cfg_set, "vm_workstation/model", description, + xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__vm_workstation_model, NULL); + xbt_cfg_setdefault_string(_sg_cfg_set, "vm_workstation/model", "default"); + xbt_cfg_register(&_sg_cfg_set, "network/TCP_gamma", "Size of the biggest TCP window (cat /proc/sys/net/ipv4/tcp_[rw]mem for recv/send window; Use the last given value, which is the max window size)", xbt_cfgelm_double, 1, 1, _sg_cfg_cb__tcp_gamma, NULL); @@ -606,12 +623,12 @@ void sg_config_init(int *argc, char **argv) "Context factory to use in SIMIX. Possible values: thread"); const char *dflt_ctx_fact = "thread"; #ifdef CONTEXT_UCONTEXT - strcat(description, ", ucontext"); dflt_ctx_fact = "ucontext"; + strcat(strcat(description, ", "), dflt_ctx_fact); #endif #ifdef HAVE_RAWCTX - strcat(description, ", raw"); dflt_ctx_fact = "raw"; + strcat(strcat(description, ", "), dflt_ctx_fact); #endif strcat(description, "."); xbt_cfg_register(&_sg_cfg_set, "contexts/factory", description, @@ -623,6 +640,8 @@ void sg_config_init(int *argc, char **argv) "Stack size of contexts in Kib", xbt_cfgelm_int, 1, 1, _sg_cfg_cb_context_stack_size, NULL); xbt_cfg_setdefault_int(_sg_cfg_set, "contexts/stack_size", 128); + /* No, it was not set yet (the above setdefault() changed this to 1). */ + smx_context_stack_size_was_set = 0; /* number of parallel threads for user processes */ xbt_cfg_register(&_sg_cfg_set, "contexts/nthreads", @@ -691,7 +710,7 @@ void sg_config_init(int *argc, char **argv) xbt_cfg_setdefault_boolean(_sg_cfg_set, "smpi/use_shared_malloc", "yes"); xbt_cfg_register(&_sg_cfg_set, "smpi/cpu_threshold", - "Minimal computation time (in seconds) not discarded.", + "Minimal computation time (in seconds) not discarded, or -1 for infinity.", xbt_cfgelm_double, 1, 1, NULL, NULL); xbt_cfg_setdefault_double(_sg_cfg_set, "smpi/cpu_threshold", 1e-6); @@ -829,7 +848,9 @@ void sg_config_finalize(void) void surf_config_models_setup() { const char *workstation_model_name; + const char *vm_workstation_model_name; int workstation_id = -1; + int vm_workstation_id = -1; char *network_model_name = NULL; char *cpu_model_name = NULL; int storage_id = -1; @@ -837,6 +858,8 @@ void surf_config_models_setup() workstation_model_name = xbt_cfg_get_string(_sg_cfg_set, "workstation/model"); + vm_workstation_model_name = + xbt_cfg_get_string(_sg_cfg_set, "vm_workstation/model"); network_model_name = xbt_cfg_get_string(_sg_cfg_set, "network/model"); cpu_model_name = xbt_cfg_get_string(_sg_cfg_set, "cpu/model"); storage_model_name = xbt_cfg_get_string(_sg_cfg_set, "storage/model"); @@ -881,19 +904,15 @@ void surf_config_models_setup() XBT_DEBUG("Call workstation_model_init"); surf_workstation_model_description[workstation_id].model_init_preparse(); + XBT_DEBUG("Call vm_workstation_model_init"); + vm_workstation_id = find_model_description(surf_vm_workstation_model_description, + vm_workstation_model_name); + surf_vm_workstation_model_description[vm_workstation_id].model_init_preparse(); + XBT_DEBUG("Call storage_model_init"); storage_id = find_model_description(surf_storage_model_description, storage_model_name); surf_storage_model_description[storage_id].model_init_preparse(); - /* ********************************************************************* */ - /* TUTORIAL: New model */ - int new_model_id = -1; - char *new_model_name = NULL; - new_model_name = xbt_cfg_get_string(_sg_cfg_set, "new_model/model"); - XBT_DEBUG("Call new model_init"); - new_model_id = find_model_description(surf_new_model_description, new_model_name); - surf_new_model_description[new_model_id].model_init_preparse(); - /* ********************************************************************* */ } int sg_cfg_get_int(const char* name)