-CommunicationDeterminismChecker::CommunicationDeterminismChecker(Session* session) : Checker(session)
-{
- CommDetExtension::EXTENSION_ID = simgrid::mc::Checker::extension_create<CommDetExtension>();
- StateCommDet::EXTENSION_ID = simgrid::mc::State::extension_create<StateCommDet>();
-}
-
-CommunicationDeterminismChecker::~CommunicationDeterminismChecker() = default;
-
-RecordTrace CommunicationDeterminismChecker::get_record_trace() // override
-{
- RecordTrace res;
- for (auto const& state : stack_)
- res.push_back(state->get_transition());
- return res;
-}
-
-std::vector<std::string> CommunicationDeterminismChecker::get_textual_trace() // override
-{
- std::vector<std::string> trace;
- for (auto const& state : stack_)
- trace.push_back(state->get_transition()->to_string());
- return trace;
-}
-
-void CommunicationDeterminismChecker::log_state() // override
-{
- if (_sg_mc_comms_determinism) {
- if (extension<CommDetExtension>()->send_deterministic && not extension<CommDetExtension>()->recv_deterministic) {
- XBT_INFO("*******************************************************");
- XBT_INFO("**** Only-send-deterministic communication pattern ****");
- XBT_INFO("*******************************************************");
- XBT_INFO("%s", extension<CommDetExtension>()->recv_diff.c_str());
- }
- if (not extension<CommDetExtension>()->send_deterministic && extension<CommDetExtension>()->recv_deterministic) {
- XBT_INFO("*******************************************************");
- XBT_INFO("**** Only-recv-deterministic communication pattern ****");
- XBT_INFO("*******************************************************");
- XBT_INFO("%s", extension<CommDetExtension>()->send_diff.c_str());
- }
- }
- XBT_INFO("Expanded states = %ld", State::get_expanded_states());
- XBT_INFO("Visited states = %lu", api::get().mc_get_visited_states());
- XBT_INFO("Executed transitions = %lu", Transition::get_executed_transitions());
- XBT_INFO("Send-deterministic : %s", extension<CommDetExtension>()->send_deterministic ? "Yes" : "No");
- if (_sg_mc_comms_determinism)
- XBT_INFO("Recv-deterministic : %s", extension<CommDetExtension>()->recv_deterministic ? "Yes" : "No");
-}
-
-void CommunicationDeterminismChecker::prepare()
-{
- auto initial_state = std::make_unique<State>();
- extension_set(new CommDetExtension());
- initial_state->extension_set(new StateCommDet(extension<CommDetExtension>()));
-
- XBT_DEBUG("********* Start communication determinism verification *********");
-
- /* Add all enabled actors to the interleave set of the initial state */
- for (auto& act : api::get().get_actors()) {
- auto actor = act.copy.get_buffer();
- if (get_session().actor_is_enabled(actor->get_pid()))
- initial_state->mark_todo(actor->get_pid());
- }
-
- stack_.push_back(std::move(initial_state));
-}
-
-void CommunicationDeterminismChecker::restoreState()
-{
- auto extension = this->extension<CommDetExtension>();
-
- /* If asked to rollback on a state that has a snapshot, restore it */
- State* last_state = stack_.back().get();
- if (last_state->system_state_) {
- api::get().restore_state(last_state->system_state_);
- extension->restore_communications_pattern(last_state);
- return;
- }
-
- /* if no snapshot, we need to restore the initial state and replay the transitions */
- get_session().restore_initial_state();
-
- const unsigned long maxpid = api::get().get_maxpid();
- assert(maxpid == extension->incomplete_communications_pattern.size());
- assert(maxpid == extension->initial_communications_pattern.size());
- for (unsigned long j = 0; j < maxpid; j++) {
- extension->incomplete_communications_pattern[j].clear();
- extension->initial_communications_pattern[j].index_comm = 0;
- }
-
- /* Traverse the stack from the state at position start and re-execute the transitions */
- for (std::unique_ptr<simgrid::mc::State> const& state : stack_) {
- if (state == stack_.back())
- break;
-
- auto* transition = state->get_transition();
- transition->replay();
- extension->handle_comm_pattern(transition);
-
- /* Update statistics */
- api::get().mc_inc_visited_states();
- }
-}