+ if(_sg_mc_checkpoint){
+ if(state->system_state != NULL){
+ MC_restore_snapshot(state->system_state);
+ xbt_fifo_unshift(mc_stack_safety, state);
+ 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);
+ MC_UNSET_RAW_MEM;
+ MC_replay(mc_stack_safety, pos);
+ }
+ }else{
+ xbt_fifo_unshift(mc_stack_safety, state);
+ MC_UNSET_RAW_MEM;
+ MC_replay(mc_stack_safety, -1);
+ }
+
+ MC_SET_RAW_MEM;
+ req2 = *req;
+ for(i=0; i<simix_process_maxpid; i++)
+ interleave_proc[i] = 0;
+ i=0;
+ while((i < MC_state_interleave_size(state))){
+ i++;
+ prev_req = MC_state_get_request(state, &value);
+ if(prev_req != NULL){
+ MC_state_set_executed_request(state, prev_req, value);
+ prev_req = MC_state_get_internal_request(state);
+ if(MC_request_depend(&req2, prev_req)){
+ XBT_DEBUG("Simcall %d in process %lu dependant with simcall %d in process %lu", req2.call, req2.issuer->pid, prev_req->call, prev_req->issuer->pid);
+ interleave_proc[prev_req->issuer->pid] = 1;
+ }else{
+ XBT_DEBUG("Simcall %d in process %lu independant with simcall %d in process %lu", req2.call, req2.issuer->pid, prev_req->call, prev_req->issuer->pid);
+ MC_state_remove_interleave_process(state, prev_req->issuer);
+ }
+ }
+ }
+ xbt_swag_foreach(process, simix_global->process_list){
+ if(interleave_proc[process->pid] == 1)
+ MC_state_interleave_process(state, process);
+ }
+ XBT_DEBUG("Back-tracking to depth %d", xbt_fifo_size(mc_stack_safety));