Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Code for evaluation of the impact of the hash
[simgrid.git] / src / mc / mc_compare.c
index 69184599b8962893be821b7060f5c4fad90a1443..b9ea20c69a06ad6f6e8c7f182e29933e5991d6b7 100644 (file)
@@ -151,13 +151,8 @@ static int compare_areas_with_type(void *area1, void *area2, mc_object_info_t in
     case DW_TAG_structure_type:
     case DW_TAG_union_type:
       if(subtype->byte_size == 0){ /*declaration of the type, need the complete description */
-        dw_type_t full_type = xbt_dict_get_or_null(other_info->types_by_name, subtype->name);
-        if(full_type) {
-          type = full_type;
-        } else {
           subtype = xbt_dict_get_or_null(other_info->types_by_name, subtype->name);
           switch_types = 1;
-        }
       }
       elm_size = subtype->byte_size;
       break;
@@ -209,14 +204,14 @@ static int compare_areas_with_type(void *area1, void *area2, mc_object_info_t in
       // The pointers are both in the heap:
       if(addr_pointed1 > std_heap && (char *)addr_pointed1 < (char*) std_heap + STD_HEAP_SIZE){
         if(!(addr_pointed2 > std_heap && (char *)addr_pointed2 < (char*) std_heap + STD_HEAP_SIZE))
-          xbt_die("Die");
+          return 1;
         return compare_heap_area(addr_pointed1, addr_pointed2, NULL, info, other_info, type->dw_type_id, pointer_level);
       }
 
       // The pointers are both in the current object R/W segment:
       else if(addr_pointed1 > start_data && (char*)addr_pointed1 <= (char *)start_data + region_size){
         if(!(addr_pointed2 > start_data && (char*)addr_pointed2 <= (char *)start_data + region_size))
-          xbt_die("Die");
+          return 1;
         if(type->dw_type_id == NULL)
           return  (addr_pointed1 != addr_pointed2);
         else
@@ -395,10 +390,14 @@ int snapshot_compare(void *state1, void *state2){
     xbt_os_walltimer_start(timer);
   #endif
 
+  int hash_result = 0;
   if(MC_USE_SNAPSHOT_HASH) {
-    if(s1->hash != s2->hash) {
+    hash_result = (s1->hash != s2->hash);
+    if(hash_result) {
       XBT_VERB("(%d - %d) Different hash : 0x%" PRIx64 "--0x%" PRIx64, num1, num2, s1->hash, s2->hash);
+#ifndef MC_DEBUG
       return 1;
+#endif
     } else {
       XBT_VERB("(%d - %d) Same hash : 0x%" PRIx64, num1, num2, s1->hash);
     }
@@ -603,10 +602,22 @@ int snapshot_compare(void *state1, void *state2){
   #endif
 
 #ifdef MC_VERBOSE
-   if(errors==0)
+   if(errors || hash_result)
+     XBT_VERB("(%d - %d) Difference found", num1, num2);
+   else
      XBT_VERB("(%d - %d) No difference found", num1, num2);
 #endif
-  return errors > 0;
+
+#if defined(MC_DEBUG) && defined(MC_VERBOSE) && MC_USE_SNAPSHOT_HASH
+   // * false positive SHOULD be avoided.
+   // * There MUST not be any false negative.
+
+   XBT_VERB("(%d - %d) State equality hash test is %s %s", num1, num2,
+     (hash_result!=0) == (errors!=0) ? "true" : "false",
+     !hash_result ? "positive" : "negative");
+#endif
+
+   return errors > 0 || hash_result;
   
 }