/* Safety */
-xbt_fifo_t mc_stack_safety_stateful = NULL;
-xbt_fifo_t mc_stack_safety_stateless = NULL;
+xbt_fifo_t mc_stack_safety = NULL;
mc_stats_t mc_stats = NULL;
/* Liveness */
/**
* \brief Initialize the model-checker data structures
*/
-void MC_init_safety_stateless(void)
+void MC_init_safety(void)
{
/* Check if MC is already initialized */
mc_stats->state_size = 1;
/* Create exploration stack */
- mc_stack_safety_stateless = xbt_fifo_new();
+ mc_stack_safety = xbt_fifo_new();
MC_UNSET_RAW_MEM;
initial_snapshot = xbt_new0(s_mc_snapshot_t, 1);
MC_take_snapshot(initial_snapshot);
MC_UNSET_RAW_MEM;
-}
-
-void MC_init_safety_stateful(void){
-
-
- /* Check if MC is already initialized */
- if (initial_snapshot)
- return;
-
- 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 = xbt_new0(s_mc_stats_t, 1);
- mc_stats->state_size = 1;
-
- /* Create exploration stack */
- mc_stack_safety_stateful = xbt_fifo_new();
-
- MC_UNSET_RAW_MEM;
-
- MC_dpor_stateful_init();
-
}
+
static void MC_init_liveness(xbt_automaton_t a){
XBT_DEBUG("Start init mc");
XBT_DEBUG("Creating stack");
- /* Create exploration stack */
+ /* Create exploration stack */
mc_stack_liveness = xbt_fifo_new();
MC_UNSET_RAW_MEM;
void MC_modelcheck(void)
{
- MC_init_safety_stateless();
+ MC_init_safety();
MC_dpor();
MC_exit();
}
-void MC_modelcheck_stateful(void)
-{
- MC_init_safety_stateful();
- MC_dpor_stateful();
- MC_exit();
-}
void MC_modelcheck_liveness(xbt_automaton_t a){
xbt_dynar_foreach(simix_global->process_that_ran, iter, process) {
req = &process->simcall;
if (req->call != SIMCALL_NONE && !MC_request_is_visible(req))
- SIMIX_simcall_pre(req, 0);
+ SIMIX_simcall_pre(req, 0);
}
}
}
}
/**
- * \brief Re-executes from the initial state all the transitions indicated by
+ * \brief Re-executes from the state at position start all the transitions indicated by
* a given model-checker stack.
* \param stack The stack with the transitions to execute.
-*/
-void MC_replay(xbt_fifo_t stack)
+ * \param start Start index to begin the re-execution.
+ */
+void MC_replay(xbt_fifo_t stack, int start)
{
- int value;
+ int value, i = 1;
char *req_str;
smx_simcall_t req = NULL, saved_req = NULL;
- xbt_fifo_item_t item;
+ xbt_fifo_item_t item, start_item;
mc_state_t state;
XBT_DEBUG("**** Begin Replay ****");
- /* Restore the initial state */
- MC_restore_snapshot(initial_snapshot);
- /* At the moment of taking the snapshot the raw heap was set, so restoring
- * it will set it back again, we have to unset it to continue */
- MC_UNSET_RAW_MEM;
+ if(start == -1){
+ /* Restore the initial state */
+ MC_restore_snapshot(initial_snapshot);
+ /* At the moment of taking the snapshot the raw heap was set, so restoring
+ * it will set it back again, we have to unset it to continue */
+ MC_UNSET_RAW_MEM;
+ }
- /* Traverse the stack from the initial state and re-execute the transitions */
- for (item = xbt_fifo_get_last_item(stack);
+ start_item = xbt_fifo_get_last_item(stack);
+ if(start != -1){
+ while (i != start){
+ start_item = xbt_fifo_get_prev_item(start_item);
+ i++;
+ }
+ }
+
+ /* Traverse the stack from the state at position start and re-execute the transitions */
+ for (item = start_item;
item != xbt_fifo_get_first_item(stack);
item = xbt_fifo_get_prev_item(item)) {
if(pair->requests > 0){
- saved_req = MC_state_get_executed_request(state, &value);
- //XBT_DEBUG("SavedReq->call %u", saved_req->call);
+ saved_req = MC_state_get_executed_request(state, &value);
+ //XBT_DEBUG("SavedReq->call %u", saved_req->call);
- if(saved_req != NULL){
- /* because we got a copy of the executed request, we have to fetch the
- real one, pointed by the request field of the issuer process */
- req = &saved_req->issuer->simcall;
- //XBT_DEBUG("Req->call %u", req->call);
-
- /* Debug information */
- if(XBT_LOG_ISENABLED(mc_global, xbt_log_priority_debug)){
- req_str = MC_request_to_string(req, value);
- XBT_DEBUG("Replay (depth = %d) : %s (%p)", depth, req_str, state);
- xbt_free(req_str);
- }
-
- }
+ if(saved_req != NULL){
+ /* because we got a copy of the executed request, we have to fetch the
+ real one, pointed by the request field of the issuer process */
+ req = &saved_req->issuer->simcall;
+ //XBT_DEBUG("Req->call %u", req->call);
+
+ /* Debug information */
+ if(XBT_LOG_ISENABLED(mc_global, xbt_log_priority_debug)){
+ req_str = MC_request_to_string(req, value);
+ XBT_DEBUG("Replay (depth = %d) : %s (%p)", depth, req_str, state);
+ xbt_free(req_str);
+ }
+
+ }
- SIMIX_simcall_pre(req, value);
- MC_wait_for_requests();
+ SIMIX_simcall_pre(req, value);
+ MC_wait_for_requests();
}
depth++;
/* Traverse the stack from the initial state and re-execute the transitions */
for (item = xbt_fifo_get_last_item(stack);
- item != xbt_fifo_get_first_item(stack);
- item = xbt_fifo_get_prev_item(item)) {
+ item != xbt_fifo_get_first_item(stack);
+ item = xbt_fifo_get_prev_item(item)) {
pair = (mc_pair_stateless_t) xbt_fifo_get_item_content(item);
state = (mc_state_t) pair->graph_state;
if(pair->requests > 0){
- saved_req = MC_state_get_executed_request(state, &value);
- //XBT_DEBUG("SavedReq->call %u", saved_req->call);
+ saved_req = MC_state_get_executed_request(state, &value);
+ //XBT_DEBUG("SavedReq->call %u", saved_req->call);
- if(saved_req != NULL){
- /* because we got a copy of the executed request, we have to fetch the
- real one, pointed by the request field of the issuer process */
- req = &saved_req->issuer->simcall;
- //XBT_DEBUG("Req->call %u", req->call);
-
- /* Debug information */
- if(XBT_LOG_ISENABLED(mc_global, xbt_log_priority_debug)){
- req_str = MC_request_to_string(req, value);
- XBT_DEBUG("Replay (depth = %d) : %s (%p)", depth, req_str, state);
- xbt_free(req_str);
- }
-
- }
+ if(saved_req != NULL){
+ /* because we got a copy of the executed request, we have to fetch the
+ real one, pointed by the request field of the issuer process */
+ req = &saved_req->issuer->simcall;
+ //XBT_DEBUG("Req->call %u", req->call);
+
+ /* Debug information */
+ if(XBT_LOG_ISENABLED(mc_global, xbt_log_priority_debug)){
+ req_str = MC_request_to_string(req, value);
+ XBT_DEBUG("Replay (depth = %d) : %s (%p)", depth, req_str, state);
+ xbt_free(req_str);
+ }
+
+ }
- SIMIX_simcall_pre(req, value);
- MC_wait_for_requests();
+ SIMIX_simcall_pre(req, value);
+ MC_wait_for_requests();
}
depth++;
XBT_DEBUG("**** End Replay ****");
}
-
/**
* \brief Dumps the contents of a model-checker's stack and shows the actual
* execution trace
* \param stack The stack to dump
-*/
-void MC_dump_stack_safety_stateless(xbt_fifo_t stack)
+ */
+void MC_dump_stack_safety(xbt_fifo_t stack)
{
- mc_state_t state;
- MC_show_stack_safety_stateless(stack);
+ MC_show_stack_safety(stack);
- MC_SET_RAW_MEM;
- while ((state = (mc_state_t) xbt_fifo_pop(stack)) != NULL)
- MC_state_delete(state);
- MC_UNSET_RAW_MEM;
+ if(!_surf_do_mc_checkpoint){
+
+ mc_state_t state;
+
+ MC_SET_RAW_MEM;
+ while ((state = (mc_state_t) xbt_fifo_pop(stack)) != NULL)
+ MC_state_delete(state);
+ MC_UNSET_RAW_MEM;
+
+ }
}
-void MC_show_stack_safety_stateless(xbt_fifo_t stack)
+void MC_show_stack_safety(xbt_fifo_t stack)
{
int value;
mc_state_t state;
XBT_INFO("**************************");
XBT_INFO("Locked request:");
/*req_str = MC_request_to_string(req);
- XBT_INFO("%s", req_str);
- xbt_free(req_str);*/
+ XBT_INFO("%s", req_str);
+ xbt_free(req_str);*/
XBT_INFO("Counter-example execution trace:");
- MC_dump_stack_safety_stateless(mc_stack_safety_stateless);
-}
-
-void MC_show_deadlock_stateful(smx_simcall_t req)
-{
- /*char *req_str = NULL;*/
- XBT_INFO("**************************");
- XBT_INFO("*** DEAD-LOCK DETECTED ***");
- XBT_INFO("**************************");
- XBT_INFO("Locked request:");
- /*req_str = MC_request_to_string(req);
- XBT_INFO("%s", req_str);
- xbt_free(req_str);*/
- XBT_INFO("Counter-example execution trace:");
- MC_show_stack_safety_stateful(mc_stack_safety_stateful);
-}
-
-void MC_dump_stack_safety_stateful(xbt_fifo_t stack)
-{
- //mc_state_ws_t state;
-
- MC_show_stack_safety_stateful(stack);
-
- /*MC_SET_RAW_MEM;
- while ((state = (mc_state_t) xbt_fifo_pop(stack)) != NULL)
- MC_state_delete(state);
- MC_UNSET_RAW_MEM;*/
-}
-
-
-void MC_show_stack_safety_stateful(xbt_fifo_t stack)
-{
- int value;
- mc_state_ws_t state;
- xbt_fifo_item_t item;
- smx_simcall_t req;
- char *req_str = NULL;
-
- for (item = xbt_fifo_get_last_item(stack);
- (item ? (state = (mc_state_ws_t) (xbt_fifo_get_item_content(item)))
- : (NULL)); item = xbt_fifo_get_prev_item(item)) {
- req = MC_state_get_executed_request(state->graph_state, &value);
- if(req){
- req_str = MC_request_to_string(req, value);
- XBT_INFO("%s", req_str);
- xbt_free(req_str);
- }
- }
+ MC_dump_stack_safety(mc_stack_safety);
}
req = MC_state_get_executed_request(pair->graph_state, &value);
if(req){
if(pair->requests>0){
- req_str = MC_request_to_string(req, value);
- XBT_INFO("%s", req_str);
- xbt_free(req_str);
+ req_str = MC_request_to_string(req, value);
+ XBT_INFO("%s", req_str);
+ xbt_free(req_str);
}else{
- XBT_INFO("End of system requests but evolution in Büchi automaton");
+ XBT_INFO("End of system requests but evolution in Büchi automaton");
}
}
}
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);
+ (double) stats->visited_states / stats->expanded_states);
/*XBT_INFO("Exploration coverage = %lf",
- (double)stats->expanded_states / stats->state_size); */
+ (double)stats->expanded_states / stats->state_size); */
}
void MC_print_statistics_pairs(mc_stats_pair_t stats)
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);
+ (double) stats->visited_pairs / stats->expanded_pairs);
/*XBT_INFO("Exploration coverage = %lf",
- (double)stats->expanded_states / stats->state_size); */
+ (double)stats->expanded_states / stats->state_size); */
}
void MC_assert(int prop)
XBT_INFO("*** PROPERTY NOT VALID ***");
XBT_INFO("**************************");
XBT_INFO("Counter-example execution trace:");
- MC_dump_stack_safety_stateless(mc_stack_safety_stateless);
+ MC_dump_stack_safety(mc_stack_safety);
MC_print_statistics(mc_stats);
xbt_abort();
}
}
-void MC_assert_stateful(int prop)
-{
- if (MC_IS_ENABLED && !prop) {
- XBT_INFO("**************************");
- XBT_INFO("*** PROPERTY NOT VALID ***");
- XBT_INFO("**************************");
- XBT_INFO("Counter-example execution trace:");
- MC_dump_stack_safety_stateful(mc_stack_safety_stateful);
- MC_print_statistics(mc_stats);
- xbt_abort();
- }
-}
-
-
static void MC_assert_pair(int prop){
if (MC_IS_ENABLED && !prop) {
XBT_INFO("**************************");
}
xbt_automaton_t MC_create_automaton(const char *file){
- return xbt_create_automaton(file);
+ MC_SET_RAW_MEM;
+ xbt_automaton_t a = xbt_create_automaton(file);
+ MC_UNSET_RAW_MEM;
+ return a;
}