Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Fix #includes
[simgrid.git] / src / mc / LivenessChecker.hpp
index de9458b..7ce79ce 100644 (file)
@@ -7,12 +7,15 @@
 #ifndef SIMGRID_MC_LIVENESS_CHECKER_HPP
 #define SIMGRID_MC_LIVENESS_CHECKER_HPP
 
-#include <stdint.h>
+#include <cstddef>
+
+#include <string>
+#include <list>
+#include <memory>
+#include <vector>
 
 #include <simgrid_config.h>
 #include <xbt/base.h>
-#include <xbt/fifo.h>
-#include <xbt/dynar.h>
 #include <xbt/automaton.h>
 #include <xbt/memory.hpp>
 #include "src/mc/mc_state.h"
@@ -25,18 +28,15 @@ SG_END_DECL()
 namespace simgrid {
 namespace mc {
 
-extern XBT_PRIVATE xbt_automaton_t property_automaton;
-
 struct XBT_PRIVATE Pair {
   int num = 0;
-  int search_cycle = 0;
-  simgrid::mc::State* graph_state = nullptr; /* System state included */
+  bool search_cycle = false;
+  std::shared_ptr<simgrid::mc::State> graph_state = nullptr; /* System state included */
   xbt_automaton_state_t automaton_state = nullptr;
-  simgrid::xbt::unique_ptr<s_xbt_dynar_t> atomic_propositions;
+  std::shared_ptr<const std::vector<int>> atomic_propositions;
   int requests = 0;
   int depth = 0;
-  int exploration_started = 0;
-  int visited_pair_removed = 0;
+  bool exploration_started = false;
 
   Pair();
   ~Pair();
@@ -48,20 +48,20 @@ struct XBT_PRIVATE Pair {
 struct XBT_PRIVATE VisitedPair {
   int num = 0;
   int other_num = 0; /* Dot output for */
-  int acceptance_pair = 0;
-  simgrid::mc::State* graph_state = nullptr; /* System state included */
+  std::shared_ptr<simgrid::mc::State> graph_state = nullptr; /* System state included */
   xbt_automaton_state_t automaton_state = nullptr;
-  simgrid::xbt::unique_ptr<s_xbt_dynar_t> atomic_propositions;
-  size_t heap_bytes_used = 0;
+  std::shared_ptr<const std::vector<int>> atomic_propositions;
+  std::size_t heap_bytes_used = 0;
   int nb_processes = 0;
-  int acceptance_removed = 0;
-  int visited_removed = 0;
 
-  VisitedPair(int pair_num, xbt_automaton_state_t automaton_state, xbt_dynar_t atomic_propositions, simgrid::mc::State* graph_state);
+  VisitedPair(
+    int pair_num, xbt_automaton_state_t automaton_state,
+    std::shared_ptr<const std::vector<int>> atomic_propositions,
+    std::shared_ptr<simgrid::mc::State> graph_state);
   ~VisitedPair();
 };
 
-class LivenessChecker : public Checker {
+class XBT_PRIVATE LivenessChecker : public Checker {
 public:
   LivenessChecker(Session& session);
   ~LivenessChecker();
@@ -72,15 +72,20 @@ private:
   int main();
   void prepare();
   int compare(simgrid::mc::VisitedPair* state1, simgrid::mc::VisitedPair* state2);
-  simgrid::xbt::unique_ptr<s_xbt_dynar_t> getPropositionValues();
-  simgrid::mc::VisitedPair* insertAcceptancePair(simgrid::mc::Pair* pair);
-  int insertVisitedPair(simgrid::mc::VisitedPair* visited_pair, simgrid::mc::Pair* pair);
+  std::shared_ptr<const std::vector<int>> getPropositionValues();
+  std::shared_ptr<VisitedPair> insertAcceptancePair(simgrid::mc::Pair* pair);
+  int insertVisitedPair(std::shared_ptr<VisitedPair> visited_pair, simgrid::mc::Pair* pair);
   void showAcceptanceCycle(std::size_t depth);
-  void replay(xbt_fifo_t stack);
+  void replay();
   void removeAcceptancePair(int pair_num);
-public: // (non-static wannabe) fields
-  static xbt_dynar_t acceptance_pairs;
-  static xbt_fifo_t liveness_stack;
+  void purgeVisitedPairs();
+  void backtrack();
+  std::shared_ptr<Pair> newPair(Pair* pair, xbt_automaton_state_t state, std::shared_ptr<const std::vector<int>> propositions);
+public:
+  // A stack of (application_state, automaton_state) pairs for DFS exploration:
+  std::list<std::shared_ptr<Pair>> explorationStack_;
+  std::list<std::shared_ptr<VisitedPair>> acceptancePairs_;
+  std::list<std::shared_ptr<VisitedPair>> visitedPairs_;
 };
 
 }