X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/6ee7e9c2e455536ab817ae0136acfbb53822eecd..4b6daec896cfa8220c801d9c7dcf2af7eedcbff0:/src/mc/mc_global.c diff --git a/src/mc/mc_global.c b/src/mc/mc_global.c index 48b6872b05..839c96b135 100644 --- a/src/mc/mc_global.c +++ b/src/mc/mc_global.c @@ -15,9 +15,12 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_global, mc, mc_snapshot_t initial_snapshot = NULL; xbt_fifo_t mc_stack = NULL; mc_stats_t mc_stats = NULL; +mc_stats_pair_t mc_stats_pair = NULL; mc_state_t mc_current_state = NULL; char mc_replay_mode = FALSE; double *mc_time = NULL; +xbt_fifo_t mc_snapshot_stack = NULL; + /** * \brief Initialize the model-checker data structures */ @@ -51,6 +54,35 @@ void MC_init(void) MC_UNSET_RAW_MEM; } +void MC_init_with_automaton(xbt_automaton_t a){ + + XBT_DEBUG("Start init mc"); + + mc_time = xbt_new0(double, simix_process_maxpid); + + /* Initialize the data structures that must be persistent across every + iteration of the model-checker (in RAW memory) */ + + MC_SET_RAW_MEM; + + /* Initialize statistics */ + mc_stats_pair = xbt_new0(s_mc_stats_pair_t, 1); + mc_stats = xbt_new0(s_mc_stats_t, 1); + //mc_stats_pair->pair_size = 1; + + XBT_DEBUG("Creating snapshot_stack"); + + /* Create exploration stack */ + mc_snapshot_stack = xbt_fifo_new(); + + MC_UNSET_RAW_MEM; + + //MC_vddfs_with_restore_snapshot_init(a); + //MC_ddfs_with_restore_snapshot_init(a); + MC_dpor2_init(a); +} + + void MC_modelcheck(void) { MC_init(); @@ -58,6 +90,18 @@ void MC_modelcheck(void) MC_exit(); } +void MC_modelcheck_with_automaton(xbt_automaton_t a){ + MC_init_with_automaton(a); + MC_exit_with_automaton(); +} + +void MC_exit_with_automaton(void) +{ + MC_print_statistics_pairs(mc_stats_pair); + xbt_free(mc_time); + MC_memory_exit(); +} + void MC_exit(void) { MC_print_statistics(mc_stats); @@ -76,15 +120,18 @@ int MC_random(int min, int max) */ void MC_wait_for_requests(void) { - smx_req_t req = NULL; - - do { - SIMIX_context_runall(simix_global->process_to_run); - while((req = SIMIX_request_pop())){ - if(!MC_request_is_visible(req)) - SIMIX_request_pre(req, 0); + smx_process_t process; + smx_req_t req; + unsigned int iter; + + while (xbt_dynar_length(simix_global->process_to_run)) { + SIMIX_process_runall(); + xbt_dynar_foreach(simix_global->process_that_ran, iter, process) { + req = &process->request; + if (req->call != REQ_NO_REQ && !MC_request_is_visible(req)) + SIMIX_request_pre(req, 0); } - } while (xbt_dynar_length(simix_global->process_to_run)); + } } int MC_deadlock_check() @@ -219,6 +266,17 @@ void MC_print_statistics(mc_stats_t stats) (double)stats->expanded_states / stats->state_size); */ } +void MC_print_statistics_pairs(mc_stats_pair_t stats) +{ + XBT_INFO("Expanded pairs = %lu", stats->expanded_pairs); + XBT_INFO("Visited pairs = %lu", stats->visited_pairs); + //XBT_INFO("Executed transitions = %lu", stats->executed_transitions); + XBT_INFO("Expanded / Visited = %lf", + (double) stats->visited_pairs / stats->expanded_pairs); + /*XBT_INFO("Exploration coverage = %lf", + (double)stats->expanded_states / stats->state_size); */ +} + void MC_assert(int prop) { if (MC_IS_ENABLED && !prop) { @@ -232,6 +290,19 @@ void MC_assert(int prop) } } +void MC_assert_pair(int prop){ + if (MC_IS_ENABLED && !prop) { + XBT_INFO("**************************"); + XBT_INFO("*** PROPERTY NOT VALID ***"); + XBT_INFO("**************************"); + //XBT_INFO("Counter-example execution trace:"); + MC_show_snapshot_stack(mc_snapshot_stack); + //MC_dump_snapshot_stack(mc_snapshot_stack); + MC_print_statistics_pairs(mc_stats_pair); + xbt_abort(); + } +} + void MC_process_clock_add(smx_process_t process, double amount) { mc_time[process->pid] += amount;