Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
model-checker : add size of stack in parameter of the function MC_new_stack_area
[simgrid.git] / src / mc / mc_dpor.c
index b03fd4b..3c56d0d 100644 (file)
@@ -13,6 +13,9 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_dpor, mc,
  */
 void MC_dpor_init()
 {
+  
+  raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
+
   mc_state_t initial_state = NULL;
   smx_process_t process;
   
@@ -36,12 +39,15 @@ void MC_dpor_init()
     }
   }
 
-  initial_state->system_state = xbt_new0(s_mc_snapshot_t, 1);
-  MC_take_snapshot(initial_state->system_state);
-
   xbt_fifo_unshift(mc_stack_safety, initial_state);
 
   MC_UNSET_RAW_MEM;
+
+  if(raw_mem_set)
+    MC_SET_RAW_MEM;
+  else
+    MC_UNSET_RAW_MEM;
+  
     
   /* FIXME: Update Statistics 
      mc_stats->state_size +=
@@ -55,6 +61,9 @@ void MC_dpor_init()
  */
 void MC_dpor(void)
 {
+
+  raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
+
   char *req_str;
   int value;
   smx_simcall_t req = NULL, prev_req = NULL;
@@ -111,7 +120,7 @@ void MC_dpor(void)
         }
       }
 
-      if(_surf_do_mc_checkpoint && ((xbt_fifo_size(mc_stack_safety) + 1) % _surf_do_mc_checkpoint == 0)){
+      if(_surf_mc_checkpoint && ((xbt_fifo_size(mc_stack_safety) + 1) % _surf_mc_checkpoint == 0)){
         next_state->system_state = xbt_new0(s_mc_snapshot_t, 1);
         MC_take_snapshot(next_state->system_state);
       }
@@ -174,7 +183,7 @@ void MC_dpor(void)
         }
         if (MC_state_interleave_size(state)) {
           /* We found a back-tracking point, let's loop */
-          if(_surf_do_mc_checkpoint){
+          if(_surf_mc_checkpoint){
             if(state->system_state != NULL){
               MC_restore_snapshot(state->system_state);
               xbt_fifo_unshift(mc_stack_safety, state);
@@ -182,19 +191,19 @@ void MC_dpor(void)
               MC_UNSET_RAW_MEM;
             }else{
               pos = xbt_fifo_size(mc_stack_safety);
-              item = xbt_fifo_get_last_item(mc_stack_safety);
+              item = xbt_fifo_get_first_item(mc_stack_safety);
               while(pos>0){
                 restore_state = (mc_state_t) xbt_fifo_get_item_content(item);
                 if(restore_state->system_state != NULL){
                   break;
                 }else{
-                  item = xbt_fifo_get_prev_item(item);
+                  item = xbt_fifo_get_next_item(item);
                   pos--;
                 }
               }
               MC_restore_snapshot(restore_state->system_state);
               xbt_fifo_unshift(mc_stack_safety, state);
-              XBT_DEBUG("Back-tracking to depth %d", pos);
+              XBT_DEBUG("Back-tracking to depth %d", xbt_fifo_size(mc_stack_safety));
               MC_UNSET_RAW_MEM;
               MC_replay(mc_stack_safety, pos);
             }
@@ -202,7 +211,7 @@ void MC_dpor(void)
             xbt_fifo_unshift(mc_stack_safety, state);
             XBT_DEBUG("Back-tracking to depth %d", xbt_fifo_size(mc_stack_safety));
             MC_UNSET_RAW_MEM;
-            MC_replay(mc_stack_safety, 1);
+            MC_replay(mc_stack_safety, -1);
           }
           break;
         } else {
@@ -214,6 +223,13 @@ void MC_dpor(void)
   }
   MC_print_statistics(mc_stats);
   MC_UNSET_RAW_MEM;
+
+  if(raw_mem_set)
+    MC_SET_RAW_MEM;
+  else
+    MC_UNSET_RAW_MEM;
+  
+
   return;
 }