- xbt_fifo_unshift(mc_stack, mc_current_state);
- DEBUG1("Back-tracking to depth %d", xbt_fifo_size(mc_stack));
- MC_replay(mc_stack);
- MC_UNSET_RAW_MEM;
+ if(_surf_mc_checkpoint){
+ if(state->system_state != NULL){
+ MC_restore_snapshot(state->system_state);
+ xbt_fifo_unshift(mc_stack_safety, state);
+ XBT_DEBUG("Back-tracking to depth %d", xbt_fifo_size(mc_stack_safety));
+ MC_UNSET_RAW_MEM;
+ }else{
+ pos = xbt_fifo_size(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_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", xbt_fifo_size(mc_stack_safety));
+ MC_UNSET_RAW_MEM;
+ MC_replay(mc_stack_safety, pos);
+ }
+ }else{
+ 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);
+ }