#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"
namespace simgrid {
namespace mc {
-extern XBT_PRIVATE xbt_automaton_t property_automaton;
-
struct XBT_PRIVATE Pair {
int num = 0;
- int search_cycle = 0;
- mc_state_t 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(unsigned long expanded_pairs);
~Pair();
Pair(Pair const&) = delete;
struct XBT_PRIVATE VisitedPair {
int num = 0;
int other_num = 0; /* Dot output for */
- int acceptance_pair = 0;
- mc_state_t 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, mc_state_t 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();
int run() override;
+ RecordTrace getRecordTrace() override;
+ std::vector<std::string> getTextualTrace() override;
+ void logState() override;
private:
int main();
void prepare();
int compare(simgrid::mc::VisitedPair* state1, simgrid::mc::VisitedPair* state2);
- void dumpStack(xbt_fifo_t stack);
- void showStack(xbt_fifo_t stack);
- 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);
+ void purgeVisitedPairs();
+ void backtrack();
+ std::shared_ptr<Pair> newPair(Pair* pair, xbt_automaton_state_t state, std::shared_ptr<const std::vector<int>> propositions);
+private:
+ // 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_;
+ unsigned long visitedPairsCount_ = 0;
+ unsigned long expandedPairsCount_ = 0;
+ unsigned long expandedStatesCount_ = 0;
+ int previousPair_ = 0;
+ std::string previousRequest_;
};
}