X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/b964bfc95af9e4c829c9a3f558a3a01bd73e01c1..85861efad8a0c75dfc4cca06c3f8adcf86d49495:/src/mc/udpor_global.hpp diff --git a/src/mc/udpor_global.hpp b/src/mc/udpor_global.hpp index e166adab33..89d4c8f9a3 100644 --- a/src/mc/udpor_global.hpp +++ b/src/mc/udpor_global.hpp @@ -3,13 +3,96 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#ifndef SIMGRID_MC_UDPOR_GLOBAL_HPP +#ifndef SIMGRID_MC_UDPOR_GLOBAL_HPP #define SIMGRID_MC_UDPOR_GLOBAL_HPP +#include +#include + namespace simgrid { namespace mc { +class UnfoldingEvent; +using EventSet = std::deque; + +class EvtSetTools { +public: + static bool contains(const EventSet& events, const UnfoldingEvent* e); + static UnfoldingEvent* find(const EventSet& events, const UnfoldingEvent* e); + static void subtract(EventSet& events, EventSet const& otherSet); + static bool depends(const EventSet& events, const EventSet& otherSet); + static bool isEmptyIntersection(EventSet evtS1, EventSet evtS2); + static EventSet makeUnion(const EventSet& s1, const EventSet& s2); + static void pushBack(EventSet& events, UnfoldingEvent* e); + static void remove(EventSet& events, UnfoldingEvent* e); + static EventSet minus(EventSet events, UnfoldingEvent* e); + static EventSet plus(EventSet events, UnfoldingEvent* e); +}; + +struct s_evset_in_t { + EventSet causuality_events; + EventSet cause; + EventSet ancestorSet; +}; + +class Configuration { +public: + EventSet events_; + EventSet maxEvent; // Events recently added to events_ + EventSet actorMaxEvent; // maximal events of the actors in current configuration + UnfoldingEvent* lastEvent; // The last added event + + Configuration plus_config(UnfoldingEvent*) const; + void createEvts(Configuration C, EventSet& result, const std::string& trans_tag, s_evset_in_t ev_sets, bool chk, + UnfoldingEvent* immPreEvt); + void updateMaxEvent(UnfoldingEvent*); // update maximal events of the configuration and actors + UnfoldingEvent* findActorMaxEvt(int actorId); // find maximal event of a Actor whose id = actorId + + UnfoldingEvent* findTestedComm(const UnfoldingEvent* testEvt); // find comm tested by action testTrans + + Configuration() = default; + Configuration(const Configuration&) = default; + Configuration& operator=(Configuration const&) = default; + Configuration(Configuration&&) = default; +}; + +class UnfoldingEvent { +public: + UnfoldingEvent(unsigned int nb_events, std::string const& trans_tag, EventSet const& causes, int sid = -1); + UnfoldingEvent(const UnfoldingEvent&) = default; + UnfoldingEvent& operator=(UnfoldingEvent const&) = default; + UnfoldingEvent(UnfoldingEvent&&) = default; + + EventSet getHistory() const; + + bool isConflict(UnfoldingEvent* event, UnfoldingEvent* otherEvent) const; + bool concernSameComm(const UnfoldingEvent* event, const UnfoldingEvent* otherEvent) const; + + // check otherEvent is in my history ? + bool inHistory(UnfoldingEvent* otherEvent) const; + + bool isImmediateConflict1(UnfoldingEvent* evt, UnfoldingEvent* otherEvt) const; + + bool conflictWithConfig(UnfoldingEvent* event, Configuration const& config) const; + /* TODO: implement */ + bool operator==(const UnfoldingEvent&) const { return false; }; + void print() const; + + inline int get_state_id() const { return state_id; } + inline void set_state_id(int sid) { state_id = sid; } + + inline std::string get_transition_tag() const { return transition_tag; } + inline void set_transition_tag(std::string const& tr_tag) { transition_tag = tr_tag; } +private: + EventSet causes; // used to store directed ancestors of event e + int id = -1; + int state_id{-1}; + std::string transition_tag{""}; // The tag of the last transition that lead to creating the event + bool transition_is_IReceive(const UnfoldingEvent* testedEvt, const UnfoldingEvent* SdRcEvt) const; + bool transition_is_ISend(const UnfoldingEvent* testedEvt, const UnfoldingEvent* SdRcEvt) const; + bool check_tr_concern_same_comm(bool& chk1, bool& chk2, UnfoldingEvent* evt1, UnfoldingEvent* evt2) const; +}; } // namespace mc } // namespace simgrid -#endif \ No newline at end of file +#endif