Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[trace] free dicts on TRACE_end.
[simgrid.git] / src / mc / mc_liveness.c
index 1b05a14..6c35380 100644 (file)
@@ -5,6 +5,7 @@
 
 #include "mc_private.h"
 #include <unistd.h>
+#include <sys/wait.h>
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_liveness, mc,
                                 "Logging specific to algorithms for liveness properties verification");
@@ -33,106 +34,43 @@ unsigned int hash_region(char *str, int str_len){
 
 }
 
-int data_program_region_compare(void *d1, void *d2, size_t size){
-  int distance = 0;
-  int i;
-  
-  for(i=0; i<size; i++){
-    if(memcmp(((char *)d1) + i, ((char *)d2) + i, 1) != 0){
-      fprintf(stderr,"Different byte (offset=%d) (%p - %p) in data program region\n", i, (char *)d1 + i, (char *)d2 + i);
-      distance++;
-    }
-  }
-  
-  fprintf(stderr, "Hamming distance between data program regions : %d\n", distance);
-
-  return distance;
-}
-
-int data_libsimgrid_region_compare(void *d1, void *d2, size_t size){
-  int distance = 0;
-  int i;
-  
-  for(i=0; i<size; i++){
-    if(memcmp(((char *)d1) + i, ((char *)d2) + i, 1) != 0){
-      fprintf(stderr, "Different byte (offset=%d) (%p - %p) in data libsimgrid region\n", i, (char *)d1 + i, (char *)d2 + i);
-      distance++;
-    }
-  }
+int create_dump(int pair)
+{
+   // Try to enable core dumps
+  struct rlimit core_limit;
+  core_limit.rlim_cur = RLIM_INFINITY;
+  core_limit.rlim_max = RLIM_INFINITY;
   
-  fprintf(stderr, "Hamming distance between data libsimgrid regions : %d\n", distance);
+  if(setrlimit(RLIMIT_CORE, &core_limit) < 0)
+    fprintf(stderr, "setrlimit: %s\nWarning: core dumps may be truncated or non-existant\n", strerror(errno));
   
-  return distance;
-}
-
-int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
-
-  
-  if(s1->num_reg != s2->num_reg){
-    XBT_INFO("Different num_reg (s1 = %u, s2 = %u)", s1->num_reg, s2->num_reg);
-    return 1;
-  }
-
-  int i;
-  int errors = 0;
-
-  for(i=0 ; i< s1->num_reg ; i++){
-
-    if(s1->regions[i]->type != s2->regions[i]->type){
-      XBT_INFO("Different type of region");
-      errors++;
-    }
-
-    switch(s1->regions[i]->type){
-    case 0:
-      if(s1->regions[i]->size != s2->regions[i]->size){
-        XBT_INFO("Different size of heap (s1 = %zu, s2 = %zu)", s1->regions[i]->size, s2->regions[i]->size);
-        errors++;
-      }
-      if(s1->regions[i]->start_addr != s2->regions[i]->start_addr){
-        XBT_INFO("Different start addr of heap (s1 = %p, s2 = %p)", s1->regions[i]->start_addr, s2->regions[i]->start_addr);
-        errors++;
-      }
-      if(mmalloc_compare_heap(s1->regions[i]->data, s2->regions[i]->data)){
-        XBT_INFO("Different heap (mmalloc_compare)");
-        errors++; 
-      }
-      break;
-    case 1 :
-      if(s1->regions[i]->size != s2->regions[i]->size){
-        XBT_INFO("Different size of libsimgrid (s1 = %zu, s2 = %zu)", s1->regions[i]->size, s2->regions[i]->size);
-        errors++;
-      }
-      if(s1->regions[i]->start_addr != s2->regions[i]->start_addr){
-        XBT_INFO("Different start addr of libsimgrid (s1 = %p, s2 = %p)", s1->regions[i]->start_addr, s2->regions[i]->start_addr);
-        errors++;
-      }
-      if(data_libsimgrid_region_compare(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){
-        XBT_INFO("Different memcmp for data in libsimgrid");
-        errors++;
-      }
-      break;
-    case 2 :
-      if(s1->regions[i]->size != s2->regions[i]->size){
-        XBT_INFO("Different size of data program (s1 = %zu, s2 = %zu)", s1->regions[i]->size, s2->regions[i]->size);
-        errors++;
-      }
-      if(s1->regions[i]->start_addr != s2->regions[i]->start_addr){
-        XBT_INFO("Different start addr of data program (s1 = %p, s2 = %p)", s1->regions[i]->start_addr, s2->regions[i]->start_addr);
-        errors++;
-      }
-      if(data_program_region_compare(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){
-        XBT_INFO("Different memcmp for data in program");
-        errors++;
-      }
-      break;
-    default:
-      break;
+  int status;
+  switch(fork()){
+  case 0:
+    // We are the child process -- run the actual program
+    abort();
+    break;
+    
+  case -1:
+    // An error occurred, shouldn't happen
+    perror("fork");
+    return -1;
+    
+  default:
+    // We are the parent process -- wait for the child process to exit
+    if(wait(&status) < 0)
+      perror("wait");
+    printf("child exited with status %d\n", status);
+    if(WIFSIGNALED(status) && WCOREDUMP(status)){
+      printf("got a core dump\n");
+      char *core_name = malloc(20);
+      sprintf(core_name,"mv core core_%d", pair); 
+      system((char *)core_name);
+      free(core_name);
     }
   }
 
-  return (errors > 0);
-  
+  return 0;
 }
 
 int reached(xbt_state_t st){
@@ -437,6 +375,8 @@ void set_pair_reached(xbt_state_t st){
     MC_SET_RAW_MEM;
   else
     MC_UNSET_RAW_MEM;
+
+  create_dump(xbt_dynar_length(reached_pairs));
     
 }
 
@@ -1370,60 +1310,3 @@ void MC_ddfs(int search_cycle){
     MC_UNSET_RAW_MEM;
 
 }
-
-
-#ifdef SIMGRID_TEST
-
-XBT_TEST_SUITE("mc_liveness", "Model checking liveness properties");
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(mc_liveness);
-
-XBT_TEST_UNIT("snapshots_comparison", test_compare_snapshot, "Comparison of snapshots")
-{
-
-  MC_SET_RAW_MEM;
-
-  /* Save first snapshot */
-  mc_snapshot_t snapshot1 = xbt_new0(s_mc_snapshot_t, 1);
-  MC_take_snapshot_liveness(snapshot1);
-
-  /* Save second snapshot */
-  mc_snapshot_t snapshot2 = xbt_new0(s_mc_snapshot_t, 1);
-  MC_take_snapshot_liveness(snapshot2);
-
-  MC_UNSET_RAW_MEM;
-
-  xbt_test_assert(snapshot_compare(snapshot1, snapshot2) == 0, "Different consecutive snapshot");
-  
-
-}
-
-XBT_TEST_UNIT("snapshots_comparison2", test2_compare_snapshot, "Comparison of snapshots with modification between")
-{
-
-  MC_SET_RAW_MEM;
-
-  /* Save first snapshot */
-  mc_snapshot_t snapshot1 = xbt_new0(s_mc_snapshot_t, 1);
-  MC_take_snapshot_liveness(snapshot1);
-
-  MC_UNSET_RAW_MEM;
-
-  void *test = snapshot1;
-  test = (char*)test+1;
-  char* t= strdup("toto");
-  t=strdup("tat");
-
-  MC_SET_RAW_MEM;
-
-  /* Save second snapshot */
-  mc_snapshot_t snapshot2 = xbt_new0(s_mc_snapshot_t, 1);
-  MC_take_snapshot_liveness(snapshot2);
-
-  xbt_test_assert(snapshot_compare(snapshot1, snapshot2) != 0, "Same snapshot with new allocations");
-
-  MC_UNSET_RAW_MEM;
-  
-
-}
-
-#endif