Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
model-checker : new comparison for reached pairs (automaton state + values of proposi...
authorMarion Guthmuller <marion.guthmuller@loria.fr>
Wed, 21 Sep 2011 14:59:05 +0000 (16:59 +0200)
committerMarion Guthmuller <marion.guthmuller@loria.fr>
Tue, 25 Oct 2011 11:36:58 +0000 (13:36 +0200)
examples/msg/mc/automaton.c
examples/msg/mc/automaton.h
examples/msg/mc/automatonparse_promela.c
examples/msg/mc/automatonparse_promela.h
include/xbt/automaton.h
src/mc/mc_liveness.c
src/mc/memory_map.c
src/mc/private.h
src/xbt/automaton.c

index 76342fc..46d06fa 100644 (file)
@@ -1,4 +1,4 @@
-#include "automaton.h"
+#include "xbt/automaton.h"
 
 xbt_automaton_t xbt_automaton_new_automaton(){
   xbt_automaton_t automaton = NULL;
@@ -275,3 +275,74 @@ xbt_propositional_symbol_t xbt_new_propositional_symbol(xbt_automaton_t a, const
   xbt_dynar_push(a->propositional_symbols, &prop_symb);
   return prop_symb;
 }
+
+int automaton_state_compare(xbt_state_t s1, xbt_state_t s2){
+
+  /* single id for each state, id and type sufficient for comparison*/
+
+  if(strcmp(s1->id, s2->id))
+    return 1;
+
+  if(s1->type != s2->type)
+    return 1;
+
+  return 0;
+
+}
+
+int automaton_transition_compare(const void *t1, const void *t2){
+
+  if(automaton_state_compare(((xbt_transition_t)t1)->src, ((xbt_transition_t)t2)->src))
+    return 1;
+  
+  if(automaton_state_compare(((xbt_transition_t)t1)->dst, ((xbt_transition_t)t2)->dst))
+    return 1;
+
+  if(automaton_label_transition_compare(((xbt_transition_t)t1)->label,((xbt_transition_t)t2)->label))
+    return 1;
+
+  return 0;
+  
+}
+
+int automaton_label_transition_compare(xbt_exp_label_t l1, xbt_exp_label_t l2){
+
+  if(l1->type != l2->type)
+    return 1;
+
+  switch(l1->type){
+
+  case 0 : // OR 
+  case 1 : // AND
+    if(automaton_label_transition_compare(l1->u.or_and.left_exp, l2->u.or_and.left_exp))
+      return 1;
+    else
+      return automaton_label_transition_compare(l1->u.or_and.right_exp, l2->u.or_and.right_exp);
+    break;
+
+  case 2 : // NOT
+    return automaton_label_transition_compare(l1->u.exp_not, l2->u.exp_not);
+    break;
+
+  case 3 : // predicat
+    return (strcmp(l1->u.predicat, l2->u.predicat));
+    break;
+
+  case 4 : // 1
+    return 0;
+    break;
+
+  default :
+    return -1;
+    break;
+
+  }
+
+}
+
+
+int propositional_symbols_compare_value(const void *s1, const void *s2){
+
+  return (!((int)s1 == (int)s2));
+
+}
index b5e1b9d..485f02b 100644 (file)
@@ -41,15 +41,16 @@ typedef struct xbt_exp_label{
 
 typedef struct xbt_exp_label* xbt_exp_label_t;
 
+
 typedef struct xbt_transition {
   xbt_state_t src;
   xbt_state_t dst;
   xbt_exp_label_t label;
 } s_xbt_transition;
 
-
 typedef struct xbt_transition* xbt_transition_t;
 
+
 typedef struct xbt_propositional_symbol{
   char* pred;
   void* function;
@@ -100,6 +101,15 @@ XBT_PUBLIC(xbt_propositional_symbol_t) xbt_new_propositional_symbol(xbt_automato
 
 XBT_PUBLIC(xbt_state_t) xbt_automaton_get_current_state(xbt_automaton_t a);
 
+XBT_PUBLIC(int) automaton_state_compare(xbt_state_t s1, xbt_state_t s2);
+
+XBT_PUBLIC(int) propositional_symbols_compare_value(const void *s1, const void *s2);
+
+XBT_PUBLIC(int) automaton_transition_compare(const void *t1, const void *t2);
+
+XBT_PUBLIC(int) automaton_label_transition_compare(xbt_exp_label_t l1, xbt_exp_label_t l2);
+
+
 SG_END_DECL()
 
 #endif
index 857ff0e..6159835 100644 (file)
@@ -1,4 +1,4 @@
-#include "automatonparse_promela.h"
+#include "xbt/automatonparse_promela.h"
 
 char* state_id_src;
 
@@ -10,16 +10,10 @@ void new_state(char* id, int src){
 
   char* id_state = strdup(id);
   char* first_part = strtok(id,"_");
-  int type = 0 ; // -1=état initial, 0=état intermédiaire, 1=état final, 2=état initial/final
+  int type = 0 ; // -1=état initial, 0=état intermédiaire, 1=état final
 
   if(strcmp(first_part,"accept")==0){
-     char* second_part = strtok(NULL,"_");
-     if(strcmp(second_part,"init")==0){
-       type = 2;
-     }else{
-       type = 1;
-     }
-     
+    type = 1;
   }else{
     char* second_part = strtok(NULL,"_");
     if(strcmp(second_part,"init")==0){
@@ -33,7 +27,7 @@ void new_state(char* id, int src){
     state = xbt_automaton_new_state(automaton, type, id_state);
   }
 
-  if(type==-1 || type==2)
+  if(type==-1)
     automaton->current_state = state;
 
   if(src)
@@ -94,8 +88,5 @@ xbt_automaton_t get_automaton(){
   return automaton;
 }
 
-void display_automaton(){
-  xbt_automaton_display(automaton);
-}
 
 
index ece387f..cb4fc9c 100644 (file)
@@ -18,7 +18,7 @@ XBT_PUBLIC(void) new_transition(char* id, xbt_exp_label_t label);
 XBT_PUBLIC(xbt_exp_label_t) new_label(int type, ...);
 
 XBT_PUBLIC(xbt_automaton_t) get_automaton(void);
-
+                           
 XBT_PUBLIC(void) display_automaton(void);
 
 SG_END_DECL()
index 500309d..485f02b 100644 (file)
@@ -3,9 +3,9 @@
 
 #include <stdlib.h>
 #include <string.h>
-#include "xbt/dynar.h"
-#include "xbt/sysdep.h"
-#include "xbt/graph.h"
+#include <xbt/dynar.h>
+#include <xbt/sysdep.h>
+#include <xbt/graph.h>
 
 SG_BEGIN_DECL()
 
@@ -14,7 +14,6 @@ typedef struct xbt_state {
   int type; /* -1 = init, 0 = inter, 1 = final */
   xbt_dynar_t in;
   xbt_dynar_t out;
-  int visited;
 } s_xbt_state;
 
 typedef struct xbt_state* xbt_state_t;
@@ -42,15 +41,16 @@ typedef struct xbt_exp_label{
 
 typedef struct xbt_exp_label* xbt_exp_label_t;
 
+
 typedef struct xbt_transition {
   xbt_state_t src;
   xbt_state_t dst;
   xbt_exp_label_t label;
 } s_xbt_transition;
 
-
 typedef struct xbt_transition* xbt_transition_t;
 
+
 typedef struct xbt_propositional_symbol{
   char* pred;
   void* function;
@@ -101,6 +101,15 @@ XBT_PUBLIC(xbt_propositional_symbol_t) xbt_new_propositional_symbol(xbt_automato
 
 XBT_PUBLIC(xbt_state_t) xbt_automaton_get_current_state(xbt_automaton_t a);
 
+XBT_PUBLIC(int) automaton_state_compare(xbt_state_t s1, xbt_state_t s2);
+
+XBT_PUBLIC(int) propositional_symbols_compare_value(const void *s1, const void *s2);
+
+XBT_PUBLIC(int) automaton_transition_compare(const void *t1, const void *t2);
+
+XBT_PUBLIC(int) automaton_label_transition_compare(xbt_exp_label_t l1, xbt_exp_label_t l2);
+
+
 SG_END_DECL()
 
 #endif
index 6e0bb8c..32e8b3b 100644 (file)
@@ -19,6 +19,29 @@ mc_pair_t new_pair(mc_snapshot_t sn, mc_state_t sg, xbt_state_t st){
     
 }
 
+int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
+  
+  if(s1->num_reg != s2->num_reg)
+    return 1;
+
+  int i;
+  for(i=0 ; i< s1->num_reg ; i++){
+
+    if(s1->regions[i]->size != s2->regions[i]->size)
+      return 1;
+
+    if(s1->regions[i]->start_addr != s2->regions[i]->start_addr)
+      return 1;
+
+    if(memcmp(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0)
+      return 1;
+    
+  }
+
+  return 0;
+
+}
+
 int reached(xbt_automaton_t a){
 
   if(xbt_dynar_is_empty(reached_pairs)){
@@ -30,6 +53,8 @@ int reached(xbt_automaton_t a){
     pair = xbt_new0(s_mc_pair_reached_t, 1);
     pair->automaton_state = a->current_state;
     pair->prop_ato = xbt_dynar_new(sizeof(int), NULL);
+    pair->system_state = xbt_new0(s_mc_snapshot_t, 1);
+    MC_take_snapshot(pair->system_state);
     
     /* Get values of propositional symbols */
     unsigned int cursor = 0;
@@ -42,24 +67,18 @@ int reached(xbt_automaton_t a){
     
     cursor = 0;
     mc_pair_reached_t pair_test;
-    //int size = xbt_dynar_length(pair->prop_ato);
-    //int i, d1, d2;
     
     xbt_dynar_foreach(reached_pairs, cursor, pair_test){
-      /*if(memcmp(pair_test->automaton_state, pair->automaton_state, sizeof(xbt_state_t)) == 0){
-       for(i=0; i< size; i++){
-         d1 = xbt_dynar_get_as(pair->prop_ato, i, int);
-         d2 = xbt_dynar_get_as(pair_test->prop_ato, i, int);
-         if(d1 == d2){
+      if(automaton_state_compare(pair_test->automaton_state, pair->automaton_state) == 0){
+       //XBT_DEBUG("Same automaton state");
+       if(xbt_dynar_compare(pair_test->prop_ato, pair->prop_ato, propositional_symbols_compare_value) == 0){
+         //XBT_DEBUG("Same values of propositional symbols");
+         if(snapshot_compare(pair_test->system_state, pair->system_state) == 0){
+           //XBT_DEBUG("Same system state");
            MC_UNSET_RAW_MEM;
            return 1;
          }
        }
-       }*/
-      if(memcmp(pair_test, pair, sizeof(mc_pair_reached_t)) == 0){
-       MC_UNSET_RAW_MEM;
-       return 1;
       }
     }
 
@@ -79,6 +98,8 @@ int set_pair_reached(xbt_automaton_t a){
     pair = xbt_new0(s_mc_pair_reached_t, 1);
     pair->automaton_state = a->current_state;
     pair->prop_ato = xbt_dynar_new(sizeof(int), NULL);
+    pair->system_state = xbt_new0(s_mc_snapshot_t, 1);
+    MC_take_snapshot(pair->system_state);
     
     /* Get values of propositional symbols */
     unsigned int cursor = 0;
@@ -921,8 +942,7 @@ void MC_ddfs_stateless(xbt_automaton_t a, int search_cycle, int replay){
 
     MC_UNSET_RAW_MEM;
     
-    
-    
+
     cursor= 0;
     xbt_dynar_foreach(current_pair->automaton_state->out, cursor, transition_succ){
 
@@ -960,9 +980,7 @@ void MC_ddfs_stateless(xbt_automaton_t a, int search_cycle, int replay){
       MC_UNSET_RAW_MEM;
     }
 
-    cursor = 0;
-
-   
+    cursor = 0; 
 
     xbt_dynar_foreach(successors, cursor, pair_succ){
      
index e5ea6c8..d1f279e 100644 (file)
@@ -2,6 +2,9 @@
 #include "private.h"
 #include <stdlib.h>
 
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_memory_map, mc,
+                                "Logging specific to algorithms for memory_map");
+
 memory_map_t get_memory_map(void)
 {
   FILE *fp;                     /* File pointer to process's proc maps file */
@@ -22,11 +25,15 @@ memory_map_t get_memory_map(void)
   xbt_assert(fp,
               "Cannot open /proc/self/maps to investigate the memory map of the process. Please report this bug.");
 
+  //XBT_DEBUG("/proc/self/maps");
+
   ret = xbt_new0(s_memory_map_t, 1);
 
   /* Read one line at the time, parse it and add it to the memory map to be returned */
   while ((read = getline(&line, &n, fp)) != -1) {
 
+    //XBT_DEBUG("%s", line);
+
     /* Wipeout the new line character */
     line[read - 1] = '\0';
 
index 91ca9d8..31fa84a 100644 (file)
@@ -195,6 +195,8 @@ typedef struct s_mc_pair{
 typedef struct s_mc_pair_reached{
   xbt_state_t automaton_state;
   xbt_dynar_t prop_ato;
+  mc_snapshot_t system_state;
+  
 }s_mc_pair_reached_t, *mc_pair_reached_t;
 
 extern xbt_fifo_t mc_stack_liveness_stateful;
@@ -204,6 +206,7 @@ mc_pair_t new_pair(mc_snapshot_t sn, mc_state_t sg, xbt_state_t st);
 
 int reached(xbt_automaton_t a);
 int set_pair_reached(xbt_automaton_t a);
+int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2);
 void MC_show_stack_liveness_stateful(xbt_fifo_t stack);
 void MC_dump_stack_liveness_stateful(xbt_fifo_t stack);
 void MC_pair_delete(mc_pair_t pair);
index 7eb3904..46d06fa 100644 (file)
@@ -1,5 +1,4 @@
 #include "xbt/automaton.h"
-#include "xbt/dynar.h"
 
 xbt_automaton_t xbt_automaton_new_automaton(){
   xbt_automaton_t automaton = NULL;
@@ -13,7 +12,6 @@ xbt_automaton_t xbt_automaton_new_automaton(){
 xbt_state_t xbt_automaton_new_state(xbt_automaton_t a, int type, char* id){
   xbt_state_t state = NULL;
   state = xbt_new0(struct xbt_state, 1);
-  state->visited = 0;
   state->type = type;
   state->id = strdup(id);
   state->in = xbt_dynar_new(sizeof(xbt_transition_t), NULL);
@@ -277,3 +275,74 @@ xbt_propositional_symbol_t xbt_new_propositional_symbol(xbt_automaton_t a, const
   xbt_dynar_push(a->propositional_symbols, &prop_symb);
   return prop_symb;
 }
+
+int automaton_state_compare(xbt_state_t s1, xbt_state_t s2){
+
+  /* single id for each state, id and type sufficient for comparison*/
+
+  if(strcmp(s1->id, s2->id))
+    return 1;
+
+  if(s1->type != s2->type)
+    return 1;
+
+  return 0;
+
+}
+
+int automaton_transition_compare(const void *t1, const void *t2){
+
+  if(automaton_state_compare(((xbt_transition_t)t1)->src, ((xbt_transition_t)t2)->src))
+    return 1;
+  
+  if(automaton_state_compare(((xbt_transition_t)t1)->dst, ((xbt_transition_t)t2)->dst))
+    return 1;
+
+  if(automaton_label_transition_compare(((xbt_transition_t)t1)->label,((xbt_transition_t)t2)->label))
+    return 1;
+
+  return 0;
+  
+}
+
+int automaton_label_transition_compare(xbt_exp_label_t l1, xbt_exp_label_t l2){
+
+  if(l1->type != l2->type)
+    return 1;
+
+  switch(l1->type){
+
+  case 0 : // OR 
+  case 1 : // AND
+    if(automaton_label_transition_compare(l1->u.or_and.left_exp, l2->u.or_and.left_exp))
+      return 1;
+    else
+      return automaton_label_transition_compare(l1->u.or_and.right_exp, l2->u.or_and.right_exp);
+    break;
+
+  case 2 : // NOT
+    return automaton_label_transition_compare(l1->u.exp_not, l2->u.exp_not);
+    break;
+
+  case 3 : // predicat
+    return (strcmp(l1->u.predicat, l2->u.predicat));
+    break;
+
+  case 4 : // 1
+    return 0;
+    break;
+
+  default :
+    return -1;
+    break;
+
+  }
+
+}
+
+
+int propositional_symbols_compare_value(const void *s1, const void *s2){
+
+  return (!((int)s1 == (int)s2));
+
+}