X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ab8e2fe95944fb998edd6e95d1022a05175c4f92..a368c183d1cef6c5c80f4d32ae7154f70c684b06:/src/mc/mc_state.h diff --git a/src/mc/mc_state.h b/src/mc/mc_state.h index 3fb62da892..599b0cb785 100644 --- a/src/mc/mc_state.h +++ b/src/mc/mc_state.h @@ -16,6 +16,8 @@ #include #include "src/simix/smx_private.h" #include "src/mc/mc_snapshot.h" +#include "src/mc/mc_record.h" +#include "src/mc/Transition.hpp" namespace simgrid { namespace mc { @@ -59,58 +61,89 @@ struct PatternCommunication { }; -/* Possible exploration status of a process in a state */ -enum class ProcessInterleaveState { - no_interleave=0, /* Do not interleave (do not execute) */ - interleave, /* Interleave the process (one or more request) */ - more_interleave, /* Interleave twice the process (for mc_random simcall) */ - done /* Already interleaved */ -}; - /* On every state, each process has an entry of the following type */ -struct ProcessState { +class ProcessState { + /* Possible exploration status of a process in a state */ + enum class InterleavingType { + /** We do not have to execute this process transitions */ + disabled = 0, + /** We still have to execute (some of) this process transitions */ + interleave, + /** We have already executed this process transitions */ + done, + }; + /** Exploration control information */ - ProcessInterleaveState state = ProcessInterleaveState::no_interleave; + InterleavingType state = InterleavingType::disabled; +public: + /** Number of times that the process was interleaved */ - unsigned int interleave_count; + // TODO, make this private + unsigned int interleave_count = 0; - bool done() const + bool isDisabled() const + { + return this->state == InterleavingType::disabled; + } + bool isDone() const { - return this->state == ProcessInterleaveState::done; + return this->state == InterleavingType::done; } - bool interleave() const { - return this->state == ProcessInterleaveState::interleave - || this->state == ProcessInterleaveState::more_interleave; + bool isToInterleave() const + { + return this->state == InterleavingType::interleave; + } + void interleave() + { + this->state = InterleavingType::interleave; + this->interleave_count = 0; + } + void setDone() + { + this->state = InterleavingType::done; } }; -/* An exploration state. - * - * The `executed_state` is sometimes transformed into another `internal_req`. - * For example WAITANY is transformes into a WAIT and TESTANY into TEST. - * See `MC_state_set_executed_request()`. +/* A node in the exploration graph (kind-of) */ struct XBT_PRIVATE State { + + /** Sequential state number (used for debugging) */ + int num = 0; + /** State's exploration status by process */ std::vector processStates; - s_smx_synchro_t internal_comm; /* To be referenced by the internal_req */ - s_smx_simcall_t internal_req; /* Internal translation of request */ - s_smx_simcall_t executed_req; /* The executed request of the state */ - int req_num = 0; /* The request number (in the case of a - multi-request like waitany ) */ - std::shared_ptr system_state = nullptr; /* Snapshot of system state */ - int num = 0; - int in_visited_states = 0; - // comm determinism verification (xbt_dynar_t): - std::vector> incomplete_comm_pattern; + Transition transition; + + /** The simcall which was executed */ + s_smx_simcall_t executed_req; + + /* Internal translation of the simcall + * + * SIMCALL_COMM_TESTANY is translated to a SIMCALL_COMM_TEST + * and SIMCALL_COMM_WAITANY to a SIMCALL_COMM_WAIT. + */ + s_smx_simcall_t internal_req; - // For communication determinism verification: + /* Can be used as a copy of the remote synchro object */ + s_smx_synchro_t internal_comm; + + /** Snapshot of system state (if needed) */ + std::shared_ptr system_state; + + // For CommunicationDeterminismChecker + std::vector> incomplete_comm_pattern; std::vector communicationIndices; State(); std::size_t interleaveSize() const; + void interleave(smx_process_t process) + { + this->processStates[process->pid].interleave(); + } + Transition getTransition() const; }; XBT_PRIVATE void replay(std::list> const& stack); @@ -118,11 +151,7 @@ XBT_PRIVATE void replay(std::list> const& st } } -XBT_PRIVATE simgrid::mc::State* MC_state_new(void); -XBT_PRIVATE void MC_state_interleave_process(simgrid::mc::State* state, smx_process_t process); -XBT_PRIVATE void MC_state_set_executed_request(simgrid::mc::State* state, smx_simcall_t req, int value); -XBT_PRIVATE smx_simcall_t MC_state_get_executed_request(simgrid::mc::State* state, int *value); -XBT_PRIVATE smx_simcall_t MC_state_get_internal_request(simgrid::mc::State* state); -XBT_PRIVATE smx_simcall_t MC_state_get_request(simgrid::mc::State* state, int *value); +XBT_PRIVATE simgrid::mc::State* MC_state_new(unsigned long state_number); +XBT_PRIVATE smx_simcall_t MC_state_get_request(simgrid::mc::State* state); #endif