X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/2ec9b2255f0b467409a521da2efcc79f43812b2e..c6b1e0d38db0abceafffdc80987bd3d7f92c12c2:/src/mc/mc_state.h diff --git a/src/mc/mc_state.h b/src/mc/mc_state.h index 880098cefa..a2bd0ed170 100644 --- a/src/mc/mc_state.h +++ b/src/mc/mc_state.h @@ -15,18 +15,28 @@ #include #include "src/simix/smx_private.h" +#include "src/kernel/activity/SynchroIo.hpp" +#include "src/kernel/activity/SynchroComm.hpp" +#include "src/kernel/activity/SynchroRaw.hpp" +#include "src/kernel/activity/SynchroSleep.hpp" +#include "src/kernel/activity/SynchroExec.hpp" #include "src/mc/mc_snapshot.h" #include "src/mc/mc_record.h" +#include "src/mc/Transition.hpp" namespace simgrid { namespace mc { -extern XBT_PRIVATE std::unique_ptr initial_global_state; +enum class PatternCommunicationType { + none = 0, + send = 1, + receive = 2, +}; struct PatternCommunication { int num = 0; - smx_synchro_t comm_addr; - e_smx_comm_type_t type = SIMIX_COMM_SEND; + smx_activity_t comm_addr; + PatternCommunicationType type = PatternCommunicationType::send; unsigned long src_proc = 0; unsigned long dst_proc = 0; const char *src_host = nullptr; @@ -60,88 +70,73 @@ struct PatternCommunication { }; -/* On every state, each process has an entry of the following type */ +/* On every state, each process has an entry of the following type. + * This represents both the process and its transition because + * a process cannot have more than one enabled transition at a given time. + */ class ProcessState { - /* Possible exploration status of a process in a state */ + /* Possible exploration status of a process transition in a state. + * Either the checker did not consider the transition, or it was considered and to do, or considered and done. + */ enum class InterleavingType { - /** We do not have to execute this process transitions */ + /** This process transition is not considered by the checker (yet?) */ disabled = 0, - /** We still have to execute (some of) this process transitions */ - interleave, - /** We have already executed this process transitions */ + /** The checker algorithm decided that this process transitions should be done at some point */ + todo, + /** The checker algorithm decided that this should be done, but it was done in the meanwhile */ done, }; /** Exploration control information */ InterleavingType state = InterleavingType::disabled; public: - - /** Number of times that the process was interleaved */ + /** Number of times that the process was considered to be executed */ // TODO, make this private - unsigned int interleave_count = 0; + unsigned int times_considered = 0; - bool isDisabled() const - { + bool isDisabled() const { return this->state == InterleavingType::disabled; } - bool isDone() const - { + bool isDone() const { return this->state == InterleavingType::done; } - bool isToInterleave() const - { - return this->state == InterleavingType::interleave; + bool isTodo() const { + return this->state == InterleavingType::todo; } - void interleave() - { - this->state = InterleavingType::interleave; - this->interleave_count = 0; + /** Mark that we should try executing this process at some point in the future of the checker algorithm */ + void consider() { + this->state = InterleavingType::todo; + this->times_considered = 0; } - void setDone() - { + 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, going out of that state */ s_smx_simcall_t executed_req; - /* Internal translation of the simcall + /* Internal translation of the executed_req simcall * - * IMCALL_COMM_TESTANY is translated to a SIMCALL_COMM_TEST + * 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; /* Can be used as a copy of the remote synchro object */ - s_smx_synchro_t internal_comm; + simgrid::mc::Remote internal_comm; /** Snapshot of system state (if needed) */ std::shared_ptr system_state; @@ -150,23 +145,18 @@ struct XBT_PRIVATE State { std::vector> incomplete_comm_pattern; std::vector communicationIndices; - State(); + State(unsigned long state_number); std::size_t interleaveSize() const; - void interleave(smx_process_t process) - { - this->processStates[process->pid].interleave(); + void interleave(smx_actor_t process) { + this->processStates[process->pid].consider(); } - RecordTraceElement getRecordElement() const; + Transition getTransition() const; }; -XBT_PRIVATE void replay(std::list> const& stack); - } } -XBT_PRIVATE simgrid::mc::State* MC_state_new(void); -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 smx_simcall_t MC_state_get_request(simgrid::mc::State* state); #endif