Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
model-checker : correction of dfs algorithm for liveness properties
[simgrid.git] / src / mc / mc_global.c
index 48b6872..42e8dd1 100644 (file)
@@ -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,6 +88,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 +118,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 +264,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 +288,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;