X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/9b505ba5266efa19390e707fc0d31c97752cd664..1b911b6a9f89da36c855be22c9506b772a089ca6:/src/mc/mc_global.c diff --git a/src/mc/mc_global.c b/src/mc/mc_global.c index fec467e3aa..42e8dd131f 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,33 @@ 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_pair->pair_size = 1; + + XBT_DEBUG("Creating snapshot_stack"); + + /* Create exploration stack */ + mc_snapshot_stack = xbt_fifo_new(); + + MC_UNSET_RAW_MEM; + + //MC_dfs_init(a); + MC_dfs_init(a); +} + + void MC_modelcheck(void) { MC_init(); @@ -58,8 +88,21 @@ 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); xbt_free(mc_time); MC_memory_exit(); } @@ -75,21 +118,18 @@ int MC_random(int min, int max) */ void MC_wait_for_requests(void) { - char *req_str = NULL; - 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); - else if(XBT_LOG_ISENABLED(mc_global, xbt_log_priority_debug)){ - req_str = MC_request_to_string(req); - DEBUG1("Got: %s", req_str); - xbt_free(req_str); - } + 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() @@ -122,7 +162,7 @@ void MC_replay(xbt_fifo_t stack) xbt_fifo_item_t item; mc_state_t state; - DEBUG0("**** Begin Replay ****"); + XBT_DEBUG("**** Begin Replay ****"); /* Restore the initial state */ MC_restore_snapshot(initial_snapshot); @@ -145,8 +185,8 @@ void MC_replay(xbt_fifo_t stack) /* Debug information */ if(XBT_LOG_ISENABLED(mc_global, xbt_log_priority_debug)){ - req_str = MC_request_to_string(req); - DEBUG2("Replay: %s (%p)", req_str, state); + req_str = MC_request_to_string(req, value); + XBT_DEBUG("Replay: %s (%p)", req_str, state); xbt_free(req_str); } } @@ -158,7 +198,7 @@ void MC_replay(xbt_fifo_t stack) mc_stats->visited_states++; mc_stats->executed_transitions++; } - DEBUG0("**** End Replay ****"); + XBT_DEBUG("**** End Replay ****"); } /** @@ -191,14 +231,9 @@ void MC_show_stack(xbt_fifo_t stack) : (NULL)); item = xbt_fifo_get_prev_item(item)) { req = MC_state_get_executed_request(state, &value); if(req){ - if(req->call == REQ_COMM_WAIT && value == -1) - INFO3("[(%lu)%s] Wait Timeout (comm=%p)", - req->issuer->pid, req->issuer->name, req->comm_wait.comm); - else{ - req_str = MC_request_to_string(req); - INFO1("%s", req_str); - xbt_free(req_str); - } + req_str = MC_request_to_string(req, value); + XBT_INFO("%s", req_str); + xbt_free(req_str); } } } @@ -206,42 +241,66 @@ void MC_show_stack(xbt_fifo_t stack) void MC_show_deadlock(smx_req_t req) { /*char *req_str = NULL;*/ - INFO0("**************************"); - INFO0("*** DEAD-LOCK DETECTED ***"); - INFO0("**************************"); - INFO0("Locked request:"); + XBT_INFO("**************************"); + XBT_INFO("*** DEAD-LOCK DETECTED ***"); + XBT_INFO("**************************"); + XBT_INFO("Locked request:"); /*req_str = MC_request_to_string(req); - INFO1("%s", req_str); + XBT_INFO("%s", req_str); xbt_free(req_str);*/ - INFO0("Counter-example execution trace:"); + XBT_INFO("Counter-example execution trace:"); MC_dump_stack(mc_stack); } void MC_print_statistics(mc_stats_t stats) { - INFO1("State space size ~= %lu", stats->state_size); - INFO1("Expanded states = %lu", stats->expanded_states); - INFO1("Visited states = %lu", stats->visited_states); - INFO1("Executed transitions = %lu", stats->executed_transitions); - INFO1("Expanded / Visited = %lf", + XBT_INFO("State space size ~= %lu", stats->state_size); + XBT_INFO("Expanded states = %lu", stats->expanded_states); + XBT_INFO("Visited states = %lu", stats->visited_states); + XBT_INFO("Executed transitions = %lu", stats->executed_transitions); + XBT_INFO("Expanded / Visited = %lf", (double) stats->visited_states / stats->expanded_states); - /*INFO1("Exploration coverage = %lf", + /*XBT_INFO("Exploration coverage = %lf", + (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) { - INFO0("**************************"); - INFO0("*** PROPERTY NOT VALID ***"); - INFO0("**************************"); - INFO0("Counter-example execution trace:"); + XBT_INFO("**************************"); + XBT_INFO("*** PROPERTY NOT VALID ***"); + XBT_INFO("**************************"); + XBT_INFO("Counter-example execution trace:"); MC_dump_stack(mc_stack); MC_print_statistics(mc_stats); xbt_abort(); } } +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;