X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/932e745735378c442e2348a3a428d97b69398f86..0cfb40d124549f4dde6f00095847de0d04828adf:/src/mc/mc_state.h?ds=sidebyside diff --git a/src/mc/mc_state.h b/src/mc/mc_state.h index 032a6e5b4d..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,65 +61,68 @@ 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 == InterleavingType::done; + } + bool isToInterleave() const + { + return this->state == InterleavingType::interleave; + } + void interleave() { - return this->state == ProcessInterleaveState::done; + this->state = InterleavingType::interleave; + this->interleave_count = 0; } - bool interleave() const { - return this->state == ProcessInterleaveState::interleave - || this->state == ProcessInterleaveState::more_interleave; + 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_get_request_for_process()`. +/* A node in the exploration graph (kind-of) */ struct XBT_PRIVATE State { /** Sequential state number (used for debugging) */ int num = 0; - /* Next transition to explore for this communication - * - * Some transitions are not deterministic such as: - * - * * waitany which can receive different messages; - * - * * random which can produce different values. - * - * This variable is used to keep track of which transition - * should be explored next for a given simcall. - */ - int req_num = 0; - /** State's exploration status by process */ std::vector processStates; - /** The simcall */ + Transition transition; + + /** The simcall which was executed */ s_smx_simcall_t executed_req; /* Internal translation of the simcall * - * IMCALL_COMM_TESTANY is translated to a SIMCALL_COMM_TEST - * and SIMCALL_COMM_WAITANY to a SIMCALL_COMM_WAIT. + * 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; @@ -134,6 +139,11 @@ struct XBT_PRIVATE State { 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); @@ -141,10 +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 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