void LivenessChecker::replay() { XBT_DEBUG("**** Begin Replay ****"); /* Intermediate backtracking */ if(_sg_mc_checkpoint > 0) { simgrid::mc::Pair* pair = explorationStack_.back().get(); if(pair->graph_state->system_state){ simgrid::mc::restore_snapshot(pair->graph_state->system_state); return; } } /* Restore the initial state */ simgrid::mc::session->restoreInitialState(); /* Traverse the stack from the initial state and re-execute the transitions */ int depth = 1; for (std::shared_ptr<Pair> const& pair : explorationStack_) { if (pair == explorationStack_.back()) break; std::shared_ptr<State> state = pair->graph_state; if (pair->exploration_started) { int req_num = state->transition.argument; smx_simcall_t saved_req = &state->executed_req; smx_simcall_t req = nullptr; if (saved_req != nullptr) { /* because we got a copy of the executed request, we have to fetch the real one, pointed by the request field of the issuer process */ const smx_process_t issuer = MC_smx_simcall_get_issuer(saved_req); req = &issuer->simcall; /* Debug information */ XBT_DEBUG("Replay (depth = %d) : %s (%p)", depth, simgrid::mc::request_to_string( req, req_num, simgrid::mc::RequestType::simix).c_str(), state.get()); } this->getSession().execute(state->transition); } /* Update statistics */ visitedPairsCount_++; mc_model_checker->executed_transitions++; depth++; } XBT_DEBUG("**** End Replay ****"); }
char *request_get_dot_output(smx_simcall_t req, int value) { char *label = nullptr; const smx_process_t issuer = MC_smx_simcall_get_issuer(req); switch (req->call) { case SIMCALL_COMM_ISEND: if (issuer->host) label = bprintf("[(%lu)%s] iSend", issuer->pid, MC_smx_process_get_host_name(issuer)); else label = bprintf("[(%lu)] iSend", issuer->pid); break; case SIMCALL_COMM_IRECV: if (issuer->host) label = bprintf("[(%lu)%s] iRecv", issuer->pid, MC_smx_process_get_host_name(issuer)); else label = bprintf("[(%lu)] iRecv", issuer->pid); break; case SIMCALL_COMM_WAIT: { if (value == -1) { if (issuer->host) label = bprintf("[(%lu)%s] WaitTimeout", issuer->pid, MC_smx_process_get_host_name(issuer)); else label = bprintf("[(%lu)] WaitTimeout", issuer->pid); } else { smx_synchro_t remote_act = simcall_comm_wait__get__comm(req); s_smx_synchro_t synchro; mc_model_checker->process().read_bytes(&synchro, sizeof(synchro), remote(remote_act)); smx_process_t src_proc = MC_smx_resolve_process(synchro.comm.src_proc); smx_process_t dst_proc = MC_smx_resolve_process(synchro.comm.dst_proc); if (issuer->host) label = bprintf("[(%lu)%s] Wait [(%lu)->(%lu)]", issuer->pid, MC_smx_process_get_host_name(issuer), src_proc ? src_proc->pid : 0, dst_proc ? dst_proc->pid : 0); else label = bprintf("[(%lu)] Wait [(%lu)->(%lu)]", issuer->pid, src_proc ? src_proc->pid : 0, dst_proc ? dst_proc->pid : 0); } break; } case SIMCALL_COMM_TEST: { smx_synchro_t remote_act = simcall_comm_test__get__comm(req); s_smx_synchro_t synchro; mc_model_checker->process().read_bytes(&synchro, sizeof(synchro), remote(remote_act)); if (synchro.comm.src_proc == nullptr || synchro.comm.dst_proc == NULL) { if (issuer->host) label = bprintf("[(%lu)%s] Test FALSE", issuer->pid, MC_smx_process_get_host_name(issuer)); else label = bprintf("[(%lu)] Test FALSE", issuer->pid); } else { if (issuer->host) label = bprintf("[(%lu)%s] Test TRUE", issuer->pid, MC_smx_process_get_host_name(issuer)); else label = bprintf("[(%lu)] Test TRUE", issuer->pid); } break; } case SIMCALL_COMM_WAITANY: { unsigned long comms_size = read_length( mc_model_checker->process(), remote(simcall_comm_waitany__get__comms(req))); if (issuer->host) label = bprintf("[(%lu)%s] WaitAny [%d of %lu]", issuer->pid, MC_smx_process_get_host_name(issuer), value + 1, comms_size); else label = bprintf("[(%lu)] WaitAny [%d of %lu]", issuer->pid, value + 1, comms_size); break; } case SIMCALL_COMM_TESTANY: if (value == -1) { if (issuer->host) label = bprintf("[(%lu)%s] TestAny FALSE", issuer->pid, MC_smx_process_get_host_name(issuer)); else label = bprintf("[(%lu)] TestAny FALSE", issuer->pid); } else { if (issuer->host) label = bprintf("[(%lu)%s] TestAny TRUE [%d of %lu]", issuer->pid, MC_smx_process_get_host_name(issuer), value + 1, xbt_dynar_length(simcall_comm_testany__get__comms(req))); else label = bprintf("[(%lu)] TestAny TRUE [%d of %lu]", issuer->pid, value + 1, xbt_dynar_length(simcall_comm_testany__get__comms(req))); } break; case SIMCALL_MUTEX_TRYLOCK: label = bprintf("[(%lu)] Mutex TRYLOCK", issuer->pid); break; case SIMCALL_MUTEX_LOCK: label = bprintf("[(%lu)] Mutex LOCK", issuer->pid); break; case SIMCALL_MC_RANDOM: if (issuer->host) label = bprintf("[(%lu)%s] MC_RANDOM (%d)", issuer->pid, MC_smx_process_get_host_name(issuer), value); else label = bprintf("[(%lu)] MC_RANDOM (%d)", issuer->pid, value); break; default: THROW_UNIMPLEMENTED; } char* str = bprintf("label = \"%s\", color = %s, fontcolor = %s", label, colors[issuer->pid - 1], colors[issuer->pid - 1]); xbt_free(label); return str; }
std::string request_get_dot_output(smx_simcall_t req, int value) { std::string label; const smx_actor_t issuer = MC_smx_simcall_get_issuer(req); switch (req->call) { case SIMCALL_COMM_ISEND: if (issuer->host) label = simgrid::xbt::string_printf("[(%lu)%s] iSend", issuer->pid, MC_smx_process_get_host_name(issuer)); else label = bprintf("[(%lu)] iSend", issuer->pid); break; case SIMCALL_COMM_IRECV: if (issuer->host) label = simgrid::xbt::string_printf("[(%lu)%s] iRecv", issuer->pid, MC_smx_process_get_host_name(issuer)); else label = simgrid::xbt::string_printf("[(%lu)] iRecv", issuer->pid); break; case SIMCALL_COMM_WAIT: { if (value == -1) { if (issuer->host) label = simgrid::xbt::string_printf("[(%lu)%s] WaitTimeout", issuer->pid, MC_smx_process_get_host_name(issuer)); else label = simgrid::xbt::string_printf("[(%lu)] WaitTimeout", issuer->pid); } else { smx_activity_t remote_act = simcall_comm_wait__get__comm(req); simgrid::mc::Remote<simgrid::kernel::activity::Comm> temp_comm; mc_model_checker->process().read(temp_comm, remote( static_cast<simgrid::kernel::activity::Comm*>(remote_act))); simgrid::kernel::activity::Comm* comm = temp_comm.getBuffer(); smx_actor_t src_proc = mc_model_checker->process().resolveProcess( simgrid::mc::remote(comm->src_proc)); smx_actor_t dst_proc = mc_model_checker->process().resolveProcess( simgrid::mc::remote(comm->dst_proc)); if (issuer->host) label = simgrid::xbt::string_printf("[(%lu)%s] Wait [(%lu)->(%lu)]", issuer->pid, MC_smx_process_get_host_name(issuer), src_proc ? src_proc->pid : 0, dst_proc ? dst_proc->pid : 0); else label = simgrid::xbt::string_printf("[(%lu)] Wait [(%lu)->(%lu)]", issuer->pid, src_proc ? src_proc->pid : 0, dst_proc ? dst_proc->pid : 0); } break; } case SIMCALL_COMM_TEST: { smx_activity_t remote_act = simcall_comm_test__get__comm(req); simgrid::mc::Remote<simgrid::kernel::activity::Comm> temp_comm; mc_model_checker->process().read(temp_comm, remote( static_cast<simgrid::kernel::activity::Comm*>(remote_act))); simgrid::kernel::activity::Comm* comm = temp_comm.getBuffer(); if (comm->src_proc == nullptr || comm->dst_proc == nullptr) { if (issuer->host) label = simgrid::xbt::string_printf("[(%lu)%s] Test FALSE", issuer->pid, MC_smx_process_get_host_name(issuer)); else label = bprintf("[(%lu)] Test FALSE", issuer->pid); } else { if (issuer->host) label = simgrid::xbt::string_printf("[(%lu)%s] Test TRUE", issuer->pid, MC_smx_process_get_host_name(issuer)); else label = simgrid::xbt::string_printf("[(%lu)] Test TRUE", issuer->pid); } break; } case SIMCALL_COMM_WAITANY: { unsigned long comms_size = read_length( mc_model_checker->process(), remote(simcall_comm_waitany__get__comms(req))); if (issuer->host) label = simgrid::xbt::string_printf("[(%lu)%s] WaitAny [%d of %lu]", issuer->pid, MC_smx_process_get_host_name(issuer), value + 1, comms_size); else label = simgrid::xbt::string_printf("[(%lu)] WaitAny [%d of %lu]", issuer->pid, value + 1, comms_size); break; } case SIMCALL_COMM_TESTANY: if (value == -1) { if (issuer->host) label = simgrid::xbt::string_printf("[(%lu)%s] TestAny FALSE", issuer->pid, MC_smx_process_get_host_name(issuer)); else label = simgrid::xbt::string_printf("[(%lu)] TestAny FALSE", issuer->pid); } else { if (issuer->host) label = simgrid::xbt::string_printf("[(%lu)%s] TestAny TRUE [%d of %lu]", issuer->pid, MC_smx_process_get_host_name(issuer), value + 1, simcall_comm_testany__get__count(req)); else label = simgrid::xbt::string_printf("[(%lu)] TestAny TRUE [%d of %lu]", issuer->pid, value + 1, simcall_comm_testany__get__count(req)); } break; case SIMCALL_MUTEX_TRYLOCK: label = simgrid::xbt::string_printf("[(%lu)] Mutex TRYLOCK", issuer->pid); break; case SIMCALL_MUTEX_LOCK: label = simgrid::xbt::string_printf("[(%lu)] Mutex LOCK", issuer->pid); break; case SIMCALL_MC_RANDOM: if (issuer->host) label = simgrid::xbt::string_printf("[(%lu)%s] MC_RANDOM (%d)", issuer->pid, MC_smx_process_get_host_name(issuer), value); else label = simgrid::xbt::string_printf("[(%lu)] MC_RANDOM (%d)", issuer->pid, value); break; default: THROW_UNIMPLEMENTED; } const char* color = get_color(issuer->pid - 1); return simgrid::xbt::string_printf( "label = \"%s\", color = %s, fontcolor = %s", label.c_str(), color, color); }