### Determine the assembly flavor that we need today
include(CMakeDetermineSystem)
-IF(CMAKE_SYSTEM_PROCESSOR MATCHES ".86")
+IF(CMAKE_SYSTEM_PROCESSOR MATCHES ".86|AMD64")
IF(${ARCH_32_BITS})
message(STATUS "System processor: i686 (${CMAKE_SYSTEM_PROCESSOR}, 32 bits)")
set(PROCESSOR_i686 1)
+/* Copyright (c) 2012-2013. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "xbt/config.h"
/*******************************************/
/*** Config Globals **************************/
/*******************************************/
XBT_PUBLIC_DATA(xbt_cfg_t) _sg_cfg_set;
+XBT_PUBLIC_DATA(int) _sg_cfg_init_status;
+XBT_PUBLIC_DATA(int) _sg_cfg_exit_asap;
XBT_PUBLIC(int) sg_cfg_get_int(const char* name);
XBT_PUBLIC(double) sg_cfg_get_double(const char* name);
XBT_PUBLIC(char*) sg_cfg_get_string(const char* name);
XBT_DEBUG("Tracing is off");
XBT_DEBUG("Tracing system is shutdown");
}
+ xbt_dynar_free(&TRACE_start_functions); /* useful when exiting early */
xbt_dynar_free(&TRACE_end_functions);
return retval;
}
-/*
- * jedule_sd_binding.c
- *
- * Created on: Dec 2, 2010
- * Author: sascha
- */
+/* Copyright (c) 2010-2013. The SimGrid Team.
+ * All rights reserved. */
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
#include "xbt/asserts.h"
#include "xbt/dynar.h"
jedule_t jedule;
-void jedule_log_sd_event(SD_task_t task) {
+void jedule_log_sd_event(SD_task_t task)
+{
xbt_dynar_t host_list;
jed_event_t event;
int i;
}
static void create_hierarchy(AS_t current_comp,
- jed_simgrid_container_t current_container) {
+ jed_simgrid_container_t current_container)
+{
xbt_dict_cursor_t cursor = NULL;
unsigned int dynar_cursor;
char *key;
hosts = xbt_dynar_new(sizeof(char*), NULL);
- xbt_dynar_foreach(current_comp->index_network_elm,
+ xbt_dynar_foreach(current_comp->index_network_elm,
dynar_cursor, network_elem) {
xbt_dynar_push_as(hosts, char*, network_elem->name);
}
}
}
-void jedule_setup_platform() {
-
+void jedule_setup_platform()
+{
AS_t root_comp;
// e_surf_network_element_type_t type;
}
-void jedule_sd_cleanup() {
-
+void jedule_sd_cleanup()
+{
jedule_cleanup_output();
}
-void jedule_sd_init() {
-
+void jedule_sd_init()
+{
jedule_init_output();
}
void jedule_sd_exit(void)
{
- jed_free_jedule(jedule);
- jedule = NULL;
+ if (jedule) {
+ jed_free_jedule(jedule);
+ jedule = NULL;
+ }
}
-void jedule_sd_dump() {
- FILE *fh;
+void jedule_sd_dump()
+{
+ if (jedule) {
+ FILE *fh;
char fname[1024];
fname[0] = '\0';
strcat(fname, xbt_binary_name);
strcat(fname, ".jed\0");
-
- fh = fopen(fname, "w");
- write_jedule_output(fh, jedule, jedule_event_list, NULL);
+ fh = fopen(fname, "w");
- fclose(fh);
+ write_jedule_output(fh, jedule, jedule_event_list, NULL);
+ fclose(fh);
+ }
}
#endif
}
}
-int snapshot_compare(void *p1, void *p2){
+int snapshot_compare(void *state1, void *state2){
- mc_snapshot_t s1 = ((mc_pair_t)p1)->graph_state->system_state;
- mc_snapshot_t s2 = ((mc_pair_t)p2)->graph_state->system_state;
+ mc_snapshot_t s1, s2;
+ int num1, num2;
+
+ if(_sg_mc_property_file && _sg_mc_property_file[0] != '\0'){ /* Liveness MC */
+ s1 = ((mc_pair_t)state1)->graph_state->system_state;
+ s2 = ((mc_pair_t)state2)->graph_state->system_state;
+ num1 = ((mc_pair_t)state1)->num;
+ num2 = ((mc_pair_t)state2)->num;
+ }else{ /* Safety MC */
+ s1 = ((mc_visited_state_t)state1)->system_state;
+ s2 = ((mc_visited_state_t)state2)->system_state;
+ num1 = ((mc_visited_state_t)state1)->num;
+ num2 = ((mc_visited_state_t)state2)->num;
+ }
int errors = 0;
int res_init;
xbt_os_walltimer_stop(timer);
mc_comp_times->stacks_sizes_comparison_time = xbt_os_timer_elapsed(timer);
}
- XBT_DEBUG("(%d - %d) Different size used in stacks : %zu - %zu", ((mc_pair_t)p1)->num, ((mc_pair_t)p2)->num, size_used1, size_used2);
+ XBT_DEBUG("(%d - %d) Different size used in stacks : %zu - %zu", num1, num2, size_used1, size_used2);
errors++;
is_diff = 1;
#else
#ifdef MC_VERBOSE
- XBT_VERB("(%d - %d) Different size used in stacks : %zu - %zu", ((mc_pair_t)p1)->num, ((mc_pair_t)p2)->num, size_used1, size_used2);
+ XBT_VERB("(%d - %d) Different size used in stacks : %zu - %zu", num1, num2, size_used1, size_used2);
#endif
xbt_os_walltimer_stop(timer);
res_init = init_heap_information((xbt_mheap_t)s1->regions[0]->data, (xbt_mheap_t)s2->regions[0]->data, s1->to_ignore, s2->to_ignore);
if(res_init == -1){
#ifdef MC_DEBUG
- XBT_DEBUG("(%d - %d) Different heap information", ((mc_pair_t)p1)->num, ((mc_pair_t)p2)->num);
+ XBT_DEBUG("(%d - %d) Different heap information", num1, num2);
errors++;
#else
#ifdef MC_VERBOSE
- XBT_VERB("(%d - %d) Different heap information", ((mc_pair_t)p1)->num, ((mc_pair_t)p2)->num);
+ XBT_VERB("(%d - %d) Different heap information", num1, num2);
#endif
xbt_os_walltimer_stop(global_timer);
xbt_os_walltimer_stop(timer);
mc_comp_times->stacks_comparison_time = xbt_os_timer_elapsed(timer);
}
- XBT_DEBUG("(%d - %d) Different local variables between stacks %d", ((mc_pair_t)p1)->num, ((mc_pair_t)p2)->num, cursor + 1);
+ XBT_DEBUG("(%d - %d) Different local variables between stacks %d", num1, num2, cursor + 1);
errors++;
is_diff = 1;
#else
#ifdef MC_VERBOSE
- XBT_VERB("(%d - %d) Different local variables between stacks %d", ((mc_pair_t)p1)->num, ((mc_pair_t)p2)->num, cursor + 1);
+ XBT_VERB("(%d - %d) Different local variables between stacks %d", num1, num2, cursor + 1);
#endif
reset_heap_information();
#ifdef MC_DEBUG
xbt_os_walltimer_stop(timer);
mc_comp_times->binary_global_variables_comparison_time = xbt_os_timer_elapsed(timer);
- XBT_DEBUG("(%d - %d) Different global variables in binary", ((mc_pair_t)p1)->num, ((mc_pair_t)p2)->num);
+ XBT_DEBUG("(%d - %d) Different global variables in binary", num1, num2);
errors++;
#else
#ifdef MC_VERBOSE
- XBT_VERB("(%d - %d) Different global variables in binary", ((mc_pair_t)p1)->num, ((mc_pair_t)p2)->num);
+ XBT_VERB("(%d - %d) Different global variables in binary", num1, num2);
#endif
reset_heap_information();
#ifdef MC_DEBUG
xbt_os_walltimer_stop(timer);
mc_comp_times->libsimgrid_global_variables_comparison_time = xbt_os_timer_elapsed(timer);
- XBT_DEBUG("(%d - %d) Different global variables in libsimgrid", ((mc_pair_t)p1)->num, ((mc_pair_t)p2)->num);
+ XBT_DEBUG("(%d - %d) Different global variables in libsimgrid", num1, num2);
errors++;
#else
#ifdef MC_VERBOSE
- XBT_VERB("(%d - %d) Different global variables in libsimgrid", ((mc_pair_t)p1)->num, ((mc_pair_t)p2)->num);
+ XBT_VERB("(%d - %d) Different global variables in libsimgrid", num1, num2);
#endif
reset_heap_information();
#ifdef MC_DEBUG
xbt_os_walltimer_stop(timer);
mc_comp_times->heap_comparison_time = xbt_os_timer_elapsed(timer);
- XBT_DEBUG("(%d - %d) Different heap (mmalloc_compare)", ((mc_pair_t)p1)->num, ((mc_pair_t)p2)->num);
+ XBT_DEBUG("(%d - %d) Different heap (mmalloc_compare)", num1, num2);
errors++;
#else
#ifdef MC_VERBOSE
- XBT_VERB("(%d - %d) Different heap (mmalloc_compare)", ((mc_pair_t)p1)->num, ((mc_pair_t)p2)->num);
+ XBT_VERB("(%d - %d) Different heap (mmalloc_compare)", num1, num2);
#endif
reset_heap_information();
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_dpor, mc,
"Logging specific to MC DPOR exploration");
+/********** Global variables **********/
+
xbt_dynar_t visited_states;
xbt_dict_t first_enabled_state;
+/********** Static functions ***********/
+
static void visited_state_free(mc_visited_state_t state){
if(state){
MC_free_snapshot(state->system_state);
}
-/* Dichotomic search in visited_states dynar.
- * States are ordered by the number of processes then the number of bytes used in std_heap */
+static int get_search_interval(xbt_dynar_t all_states, mc_visited_state_t state, int *min, int *max){
+
+ int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
+
+ MC_SET_RAW_MEM;
+
+ int cursor = 0, previous_cursor, next_cursor;
+ mc_visited_state_t state_test;
+ int start = 0;
+ int end = xbt_dynar_length(all_states) - 1;
+
+ while(start <= end){
+ cursor = (start + end) / 2;
+ state_test = (mc_visited_state_t)xbt_dynar_get_as(all_states, cursor, mc_visited_state_t);
+ if(state_test->nb_processes < state->nb_processes){
+ start = cursor + 1;
+ }else if(state_test->nb_processes > state->nb_processes){
+ end = cursor - 1;
+ }else{
+ if(state_test->heap_bytes_used < state->heap_bytes_used){
+ start = cursor +1;
+ }else if(state_test->heap_bytes_used > state->heap_bytes_used){
+ end = cursor - 1;
+ }else{
+ *min = *max = cursor;
+ previous_cursor = cursor - 1;
+ while(previous_cursor >= 0){
+ state_test = (mc_visited_state_t)xbt_dynar_get_as(all_states, previous_cursor, mc_visited_state_t);
+ if(state_test->nb_processes != state->nb_processes || state_test->heap_bytes_used != state->heap_bytes_used)
+ break;
+ *min = previous_cursor;
+ previous_cursor--;
+ }
+ next_cursor = cursor + 1;
+ while(next_cursor < xbt_dynar_length(all_states)){
+ state_test = (mc_visited_state_t)xbt_dynar_get_as(all_states, next_cursor, mc_visited_state_t);
+ if(state_test->nb_processes != state->nb_processes || state_test->heap_bytes_used != state->heap_bytes_used)
+ break;
+ *max = next_cursor;
+ next_cursor++;
+ }
+ if(!raw_mem_set)
+ MC_UNSET_RAW_MEM;
+ return -1;
+ }
+ }
+ }
+
+ if(!raw_mem_set)
+ MC_UNSET_RAW_MEM;
+
+ return cursor;
+}
static int is_visited_state(){
int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
MC_SET_RAW_MEM;
+
mc_visited_state_t new_state = visited_state_new();
- MC_UNSET_RAW_MEM;
if(xbt_dynar_is_empty(visited_states)){
- MC_SET_RAW_MEM;
xbt_dynar_push(visited_states, &new_state);
- MC_UNSET_RAW_MEM;
- if(raw_mem_set)
- MC_SET_RAW_MEM;
+ if(!raw_mem_set)
+ MC_UNSET_RAW_MEM;
return -1;
}else{
- MC_SET_RAW_MEM;
-
- size_t current_bytes_used = new_state->heap_bytes_used;
- int current_nb_processes = new_state->nb_processes;
-
- unsigned int cursor = 0;
- int previous_cursor = 0, next_cursor = 0;
- int start = 0;
- int end = xbt_dynar_length(visited_states) - 1;
-
- mc_visited_state_t state_test = NULL;
- size_t bytes_used_test;
- int nb_processes_test;
- int same_processes_and_bytes_not_found = 1;
-
- while(start <= end && same_processes_and_bytes_not_found){
- cursor = (start + end) / 2;
- state_test = (mc_visited_state_t)xbt_dynar_get_as(visited_states, cursor, mc_visited_state_t);
- bytes_used_test = state_test->heap_bytes_used;
- nb_processes_test = state_test->nb_processes;
- if(nb_processes_test < current_nb_processes){
- start = cursor + 1;
- }else if(nb_processes_test > current_nb_processes){
- end = cursor - 1;
- }else if(nb_processes_test == current_nb_processes){
- if(bytes_used_test < current_bytes_used)
- start = cursor + 1;
- if(bytes_used_test > current_bytes_used)
- end = cursor - 1;
- if(bytes_used_test == current_bytes_used){
- same_processes_and_bytes_not_found = 0;
- if(snapshot_compare(new_state->system_state, state_test->system_state) == 0){
- if(state_test->other_num == -1)
- new_state->other_num = state_test->num;
- else
- new_state->other_num = state_test->other_num;
- if(dot_output == NULL)
- XBT_DEBUG("Next state %d already visited ! (equal to state %d)", new_state->num, state_test->num);
- else
- XBT_DEBUG("Next state %d already visited ! (equal to state %d (state %d in dot_output))", new_state->num, state_test->num, new_state->other_num);
- xbt_dynar_remove_at(visited_states, cursor, NULL);
- xbt_dynar_insert_at(visited_states, cursor, &new_state);
- if(raw_mem_set)
- MC_SET_RAW_MEM;
- else
- MC_UNSET_RAW_MEM;
- return new_state->other_num;
- }else{
- /* Search another state with same number of bytes used in std_heap */
- previous_cursor = cursor - 1;
- while(previous_cursor >= 0){
- state_test = (mc_visited_state_t)xbt_dynar_get_as(visited_states, previous_cursor, mc_visited_state_t);
- bytes_used_test = state_test->system_state->heap_bytes_used;
- if(bytes_used_test != current_bytes_used)
- break;
- if(snapshot_compare(new_state->system_state, state_test->system_state) == 0){
- if(state_test->other_num == -1)
- new_state->other_num = state_test->num;
- else
- new_state->other_num = state_test->other_num;
- if(dot_output == NULL)
- XBT_DEBUG("Next state %d already visited ! (equal to state %d)", new_state->num, state_test->num);
- else
- XBT_DEBUG("Next state %d already visited ! (equal to state %d (state %d in dot_output))", new_state->num, state_test->num, new_state->other_num);
- xbt_dynar_remove_at(visited_states, previous_cursor, NULL);
- xbt_dynar_insert_at(visited_states, cursor, &new_state);
- if(raw_mem_set)
- MC_SET_RAW_MEM;
- else
- MC_UNSET_RAW_MEM;
- return new_state->other_num;
- }
- previous_cursor--;
- }
- next_cursor = cursor + 1;
- while(next_cursor < xbt_dynar_length(visited_states)){
- state_test = (mc_visited_state_t)xbt_dynar_get_as(visited_states, next_cursor, mc_visited_state_t);
- bytes_used_test = state_test->system_state->heap_bytes_used;
- if(bytes_used_test != current_bytes_used)
- break;
- if(snapshot_compare(new_state->system_state, state_test->system_state) == 0){
- if(state_test->other_num == -1)
- new_state->other_num = state_test->num;
- else
- new_state->other_num = state_test->other_num;
- if(dot_output == NULL)
- XBT_DEBUG("Next state %d already visited ! (equal to state %d)", new_state->num, state_test->num);
- else
- XBT_DEBUG("Next state %d already visited ! (equal to state %d (state %d in dot_output))", new_state->num, state_test->num, new_state->other_num);
- xbt_dynar_remove_at(visited_states, next_cursor, NULL);
- xbt_dynar_insert_at(visited_states, next_cursor, &new_state);
- if(raw_mem_set)
- MC_SET_RAW_MEM;
- else
- MC_UNSET_RAW_MEM;
- return new_state->other_num;
- }
- next_cursor++;
- }
- }
- }
+ int min = -1, max = -1, index;
+ int res;
+ mc_visited_state_t state_test;
+
+ index = get_search_interval(visited_states, new_state, &min, &max);
+
+ if(min != -1 && max != -1){
+ res = xbt_parmap_mc_apply(parmap, snapshot_compare, xbt_dynar_get_ptr(visited_states, min), (max-min)+1, new_state);
+ if(res != -1){
+ state_test = (mc_visited_state_t)xbt_dynar_get_as(visited_states, (min+res)-1, mc_visited_state_t);
+ if(state_test->other_num == -1)
+ new_state->other_num = state_test->num;
+ else
+ new_state->other_num = state_test->other_num;
+ if(dot_output == NULL)
+ XBT_DEBUG("State %d already visited ! (equal to state %d)", new_state->num, state_test->num);
+ else
+ XBT_DEBUG("State %d already visited ! (equal to state %d (state %d in dot_output))", new_state->num, state_test->num, new_state->other_num);
+ xbt_dynar_remove_at(visited_states, (min + res) - 1, NULL);
+ xbt_dynar_insert_at(visited_states, (min+res) - 1, &new_state);
+ if(!raw_mem_set)
+ MC_UNSET_RAW_MEM;
+ return new_state->other_num;
+ }
+ xbt_dynar_insert_at(visited_states, min, &new_state);
+ }else{
+ state_test = (mc_visited_state_t)xbt_dynar_get_as(visited_states, index, mc_visited_state_t);
+ if(state_test->nb_processes < new_state->nb_processes){
+ xbt_dynar_insert_at(visited_states, index+1, &new_state);
+ }else{
+ if(state_test->heap_bytes_used < new_state->heap_bytes_used)
+ xbt_dynar_insert_at(visited_states, index + 1, &new_state);
+ else
+ xbt_dynar_insert_at(visited_states, index, &new_state);
}
}
- state_test = (mc_visited_state_t)xbt_dynar_get_as(visited_states, cursor, mc_visited_state_t);
- bytes_used_test = state_test->heap_bytes_used;
-
- if(bytes_used_test < current_bytes_used)
- xbt_dynar_insert_at(visited_states, cursor + 1, &new_state);
- else
- xbt_dynar_insert_at(visited_states, cursor, &new_state);
-
if(xbt_dynar_length(visited_states) > _sg_mc_visited){
- int min = mc_stats->expanded_states;
+ int min2 = mc_stats->expanded_states;
unsigned int cursor2 = 0;
- unsigned int index = 0;
+ unsigned int index2 = 0;
xbt_dynar_foreach(visited_states, cursor2, state_test){
- if(state_test->num < min){
- index = cursor2;
- min = state_test->num;
+ if(state_test->num < min2){
+ index2 = cursor2;
+ min2 = state_test->num;
}
}
- xbt_dynar_remove_at(visited_states, index, NULL);
+ xbt_dynar_remove_at(visited_states, index2, NULL);
}
-
- MC_UNSET_RAW_MEM;
- if(raw_mem_set)
- MC_SET_RAW_MEM;
+ if(!raw_mem_set)
+ MC_UNSET_RAW_MEM;
return -1;
MC_SET_RAW_MEM;
initial_state = MC_state_new();
- visited_states = xbt_dynar_new(sizeof(mc_visited_state_t), visited_state_free_voidp);
+ if(_sg_mc_visited > 0)
+ visited_states = xbt_dynar_new(sizeof(mc_visited_state_t), visited_state_free_voidp);
first_enabled_state = xbt_dict_new_homogeneous(&xbt_free_f);
int user_max_depth_reached = 0;
-extern int _sg_init_status;
void _mc_cfg_cb_reduce(const char *name, int pos) {
- if (_sg_init_status && !_sg_do_model_check) {
+ if (_sg_cfg_init_status && !_sg_do_model_check) {
xbt_die("You are specifying a reduction strategy after the initialization (through MSG_config?), but model-checking was not activated at config time (through --cfg=model-check:1). This won't work, sorry.");
}
char *val= xbt_cfg_get_string(_sg_cfg_set, name);
}
void _mc_cfg_cb_checkpoint(const char *name, int pos) {
- if (_sg_init_status && !_sg_do_model_check) {
+ if (_sg_cfg_init_status && !_sg_do_model_check) {
xbt_die("You are specifying a checkpointing value after the initialization (through MSG_config?), but model-checking was not activated at config time (through --cfg=model-check:1). This won't work, sorry.");
}
_sg_mc_checkpoint = xbt_cfg_get_int(_sg_cfg_set, name);
}
void _mc_cfg_cb_property(const char *name, int pos) {
- if (_sg_init_status && !_sg_do_model_check) {
+ if (_sg_cfg_init_status && !_sg_do_model_check) {
xbt_die("You are specifying a property after the initialization (through MSG_config?), but model-checking was not activated at config time (through --cfg=model-check:1). This won't work, sorry.");
}
_sg_mc_property_file= xbt_cfg_get_string(_sg_cfg_set, name);
}
void _mc_cfg_cb_timeout(const char *name, int pos) {
- if (_sg_init_status && !_sg_do_model_check) {
+ if (_sg_cfg_init_status && !_sg_do_model_check) {
xbt_die("You are specifying a value to enable/disable timeout for wait requests after the initialization (through MSG_config?), but model-checking was not activated at config time (through --cfg=model-check:1). This won't work, sorry.");
}
_sg_mc_timeout= xbt_cfg_get_boolean(_sg_cfg_set, name);
}
void _mc_cfg_cb_max_depth(const char *name, int pos) {
- if (_sg_init_status && !_sg_do_model_check) {
+ if (_sg_cfg_init_status && !_sg_do_model_check) {
xbt_die("You are specifying a max depth value after the initialization (through MSG_config?), but model-checking was not activated at config time (through --cfg=model-check:1). This won't work, sorry.");
}
_sg_mc_max_depth= xbt_cfg_get_int(_sg_cfg_set, name);
}
void _mc_cfg_cb_visited(const char *name, int pos) {
- if (_sg_init_status && !_sg_do_model_check) {
+ if (_sg_cfg_init_status && !_sg_do_model_check) {
xbt_die("You are specifying a number of stored visited states after the initialization (through MSG_config?), but model-checking was not activated at config time (through --cfg=model-check:1). This won't work, sorry.");
}
_sg_mc_visited= xbt_cfg_get_int(_sg_cfg_set, name);
}
void _mc_cfg_cb_dot_output(const char *name, int pos) {
- if (_sg_init_status && !_sg_do_model_check) {
+ if (_sg_cfg_init_status && !_sg_do_model_check) {
xbt_die("You are specifying a file name for a dot output of graph state after the initialization (through MSG_config?), but model-checking was not activated at config time (through --cfg=model-check:1). This won't work, sorry.");
}
_sg_mc_dot_output_file= xbt_cfg_get_string(_sg_cfg_set, name);
}
if(xbt_dynar_length(visited_pairs) > _sg_mc_visited){
- int min = mc_stats->expanded_states;
+ int min2 = mc_stats->expanded_pairs;
unsigned int cursor2 = 0;
unsigned int index2 = 0;
xbt_dynar_foreach(visited_pairs, cursor2, pair_test){
- if(pair_test->num < min){
- index = cursor2;
- min = pair_test->num;
+ if(pair_test->num < min2){
+ index2 = cursor2;
+ min2 = pair_test->num;
}
}
xbt_dynar_remove_at(visited_pairs, index2, &pair_test);
extern __thread mc_comparison_times_t mc_comp_times;
extern __thread double mc_snapshot_comparison_time;
-int snapshot_compare(void *p1, void *p2);
+int snapshot_compare(void *state1, void *state2);
int SIMIX_pre_mc_compare_snapshots(smx_simcall_t simcall, mc_snapshot_t s1, mc_snapshot_t s2);
void print_comparison_times(void);
SD_HOST_LEVEL = xbt_lib_add_level(host_lib,__SD_workstation_destroy);
SD_LINK_LEVEL = xbt_lib_add_level(link_lib,__SD_link_destroy);
SD_STORAGE_LEVEL = xbt_lib_add_level(storage_lib,__SD_storage_destroy);
+
+ if (_sg_cfg_exit_asap) {
+ SD_exit();
+ exit(0);
+ }
}
/** \brief set a configuration variable
xbt_cfg_t _sg_cfg_set = NULL;
-int _sg_init_status = 0; /* 0: beginning of time (config cannot be changed yet);
- 1: initialized: cfg_set created (config can now be changed);
- 2: configured: command line parsed and config part of platform file was integrated also, platform construction ongoing or done.
- (Config cannot be changed anymore!) */
+/* 0: beginning of time (config cannot be changed yet);
+ * 1: initialized: cfg_set created (config can now be changed);
+ * 2: configured: command line parsed and config part of platform file was
+ * integrated also, platform construction ongoing or done.
+ * (Config cannot be changed anymore!)
+ */
+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)
argv[j] = NULL;
*argc = j;
}
- if (shall_exit) {
- _sg_init_status = 1; // get everything cleanly cleaned on exit
- exit(0);
- }
+ if (shall_exit)
+ sg_cfg_exit_early();
}
/* callback of the workstation/model variable */
{
char *val;
- xbt_assert(_sg_init_status < 2,
+ 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("workstation", surf_workstation_model_description);
- exit(0);
+ sg_cfg_exit_early();
}
/* Make sure that the model exists */
{
char *val;
- xbt_assert(_sg_init_status < 2,
+ 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("CPU", surf_cpu_model_description);
- exit(0);
+ sg_cfg_exit_early();
}
/* New Module missing */
{
char *val;
- xbt_assert(_sg_init_status < 2,
+ 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("optimization", surf_optimization_mode_description);
- exit(0);
+ sg_cfg_exit_early();
}
/* New Module missing */
{
char *val;
- xbt_assert(_sg_init_status < 2,
+ 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("storage", surf_storage_model_description);
- exit(0);
+ sg_cfg_exit_early();
}
/* New Module missing */
{
char *val;
- xbt_assert(_sg_init_status < 2,
+ 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("network", surf_network_model_description);
- exit(0);
+ sg_cfg_exit_early();
}
/* New Module missing */
{
char *val;
- xbt_assert(_sg_init_status < 2,
+ 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")) {
coll_help(category, table);
- exit(0);
+ sg_cfg_exit_early();
}
/* New Module missing */
int i;
/* Create the configuration support */
- if (_sg_init_status == 0) { /* Only create stuff if not already inited */
+ if (_sg_cfg_init_status == 0) { /* Only create stuff if not already inited */
sprintf(description,
"The model to use for the CPU. Possible values: ");
p = description;
xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__workstation_model, NULL);
xbt_cfg_setdefault_string(_sg_cfg_set, "workstation/model", "default");
- xbt_free(description);
-
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);
"If value=on, 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_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_cfg_setdefault_boolean(_sg_cfg_set, "verbose-exit", "yes");
/* context factory */
- xbt_cfg_register(&_sg_cfg_set, "contexts/factory",
- "Context factory to use in SIMIX (ucontext, thread or raw)",
- xbt_cfgelm_string, 1, 1, _sg_cfg_cb_context_factory, NULL);
-#ifndef WIN32
- xbt_cfg_setdefault_string(_sg_cfg_set, "contexts/factory", "ucontext");
-#else
- xbt_cfg_setdefault_string(_sg_cfg_set, "contexts/factory", "raw");
+ sprintf(description,
+ "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";
+#endif
+#ifdef HAVE_RAWCTX
+ strcat(description, ", raw");
+ dflt_ctx_fact = "raw";
#endif
+ strcat(description, ".");
+ xbt_cfg_register(&_sg_cfg_set, "contexts/factory", description,
+ xbt_cfgelm_string, 1, 1, _sg_cfg_cb_context_factory, NULL);
+ xbt_cfg_setdefault_string(_sg_cfg_set, "contexts/factory", dflt_ctx_fact);
/* stack size of contexts in Ko */
xbt_cfg_register(&_sg_cfg_set, "contexts/stack_size",
xbt_cfg_setdefault_string(_sg_cfg_set, "path", initial_path);
}
- _sg_init_status = 1;
+ _sg_cfg_init_status = 1;
sg_config_cmd_line(argc, argv);
} else {
XBT_WARN("Call to sg_config_init() after initialization ignored");
}
+
+ xbt_free(description);
}
void sg_config_finalize(void)
{
- if (!_sg_init_status)
+ if (!_sg_cfg_init_status)
return; /* Not initialized yet. Nothing to do */
xbt_cfg_free(&_sg_cfg_set);
- _sg_init_status = 0;
+ _sg_cfg_init_status = 0;
}
/* Pick the right models for CPU, net and workstation, and call their model_init_preparse */
}
else { /* use the factory specified by --cfg=contexts/factory:value */
- if (smx_context_factory_name == NULL) {
- /* use the default factory */
- #ifdef HAVE_RAWCTX
- SIMIX_ctx_raw_factory_init(&simix_global->context_factory);
- #elif CONTEXT_UCONTEXT
- SIMIX_ctx_sysv_factory_init(&simix_global->context_factory);
- #else
- SIMIX_ctx_thread_factory_init(&simix_global->context_factory);
- #endif
- }
- else if (!strcmp(smx_context_factory_name, "ucontext")) {
- /* use ucontext */
+
+ if (!strcmp(smx_context_factory_name, "thread")) {
+ /* use os threads (either pthreads or windows ones) */
+ SIMIX_ctx_thread_factory_init(&simix_global->context_factory);
+ }
#ifdef CONTEXT_UCONTEXT
+ else if (!strcmp(smx_context_factory_name, "ucontext")) {
+ /* use ucontext */
SIMIX_ctx_sysv_factory_init(&simix_global->context_factory);
-#else
- xbt_die("The context factory 'ucontext' unavailable on your system");
-#endif
- }
- else if (!strcmp(smx_context_factory_name, "thread")) {
- /* use os threads (either pthreads or windows ones) */
- SIMIX_ctx_thread_factory_init(&simix_global->context_factory);
}
+#endif
+#ifdef HAVE_RAWCTX
else if (!strcmp(smx_context_factory_name, "raw")) {
- /* use raw contexts */
- SIMIX_ctx_raw_factory_init(&simix_global->context_factory);
+ /* use raw contexts */
+ SIMIX_ctx_raw_factory_init(&simix_global->context_factory);
}
+#endif
else {
XBT_ERROR("Invalid context factory specified. Valid factories on this machine:");
#ifdef HAVE_RAWCTX
SIMIX_HOST_LEVEL = xbt_lib_add_level(host_lib,SIMIX_host_destroy);
- if(sg_cfg_get_boolean("clean_atexit")) atexit(SIMIX_clean);
+ if (sg_cfg_get_boolean("clean_atexit"))
+ atexit(SIMIX_clean);
+
+ if (_sg_cfg_exit_asap)
+ exit(0);
}
/**
*/
static void SIMIX_clean(void)
{
+#ifdef HAVE_TRACING
+ TRACE_end();
+#endif
#ifdef TIME_BENCH_PER_SR
smx_ctx_raw_new_sr();
#endif
* under the terms of the license (GNU LGPL) which comes with this package. */
#include "simgrid/platf_interface.h" // platform creation API internal interface
+#include "simgrid/sg_config.h"
#include "surf_routing_private.h"
#include "surf/surf_routing.h"
}
}
-extern int _sg_init_status; /* yay, this is an horrible hack */
-
/**
* \brief Make a new routing component to the platform
*
(as_router_lib, AS->id, ROUTING_ASR_LEVEL),
"The AS \"%s\" already exists", AS->id);
- _sg_init_status = 2; /* horrible hack: direct access to the global controlling the level of configuration to prevent any further config */
+ _sg_cfg_init_status = 2; /* horrible hack: direct access to the global
+ * controlling the level of configuration to prevent
+ * any further config */
/* search the routing model */
switch(AS->routing){
sg_platf_new_AS_end();
}
-extern int _sg_init_status; /* FIXME: find a proper way to export this at some point */
-
void STag_surfxml_config(void){
AS_TAG = 0;
xbt_assert(current_property_set == NULL, "Someone forgot to reset the property set to NULL in its closing tag (or XML malformed)");
XBT_DEBUG("START configuration name = %s",A_surfxml_config_id);
- if (_sg_init_status == 2) {
+ if (_sg_cfg_init_status == 2) {
surf_parse_error("All <config> tags must be given before any platform elements (such as <AS>, <host>, <cluster>, <link>, etc).");
}
}
equals_to1[i][j] = NULL;
heap_area_free(equals_to2[i][j]);
equals_to2[i][j] = NULL;
- }
+ }
+ free(equals_to1[i]);
+ free(equals_to2[i]);
}
free(equals_to1);