From: Gabriel Corona Date: Wed, 30 Mar 2016 11:27:15 +0000 (+0200) Subject: [mc] Use std::shared_ptr for VisitedPair in LivenessChecker X-Git-Tag: v3_13~212 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/520b0f15d0e4c1a831be0041652f7ae8e60850a4 [mc] Use std::shared_ptr for VisitedPair in LivenessChecker --- diff --git a/src/mc/LivenessChecker.cpp b/src/mc/LivenessChecker.cpp index c34552d9a1..6250af2c19 100644 --- a/src/mc/LivenessChecker.cpp +++ b/src/mc/LivenessChecker.cpp @@ -40,9 +40,9 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_liveness, mc, namespace simgrid { namespace mc { -std::list LivenessChecker::acceptance_pairs; +std::list> LivenessChecker::acceptance_pairs; std::list LivenessChecker::liveness_stack; -std::list LivenessChecker::visited_pairs; +std::list> LivenessChecker::visited_pairs; VisitedPair::VisitedPair(int pair_num, xbt_automaton_state_t automaton_state, xbt_dynar_t atomic_propositions, std::shared_ptr graph_state) { @@ -61,8 +61,6 @@ VisitedPair::VisitedPair(int pair_num, xbt_automaton_state_t automaton_state, xb this->automaton_state = automaton_state; this->num = pair_num; this->other_num = -1; - this->acceptance_removed = 0; - this->visited_removed = 0; this->acceptance_pair = 0; this->atomic_propositions = simgrid::xbt::unique_ptr( xbt_dynar_new(sizeof(int), nullptr)); @@ -138,25 +136,24 @@ int LivenessChecker::compare(simgrid::mc::VisitedPair* state1, simgrid::mc::Visi return simgrid::mc::snapshot_compare(num1, s1, num2, s2); } -simgrid::mc::VisitedPair* LivenessChecker::insertAcceptancePair(simgrid::mc::Pair* pair) +std::shared_ptr LivenessChecker::insertAcceptancePair(simgrid::mc::Pair* pair) { - auto new_pair = - std::unique_ptr(new VisitedPair( - pair->num, pair->automaton_state, pair->atomic_propositions.get(), - pair->graph_state)); + std::shared_ptr new_pair = std::make_shared( + pair->num, pair->automaton_state, pair->atomic_propositions.get(), + pair->graph_state); new_pair->acceptance_pair = 1; auto res = std::equal_range(acceptance_pairs.begin(), acceptance_pairs.end(), - new_pair, simgrid::mc::DerefAndCompareByNbProcessesAndUsedHeap()); + new_pair.get(), simgrid::mc::DerefAndCompareByNbProcessesAndUsedHeap()); if (pair->search_cycle == 1) for (auto i = res.first; i != res.second; ++i) { - simgrid::mc::VisitedPair* pair_test = *i; + std::shared_ptr const& pair_test = *i; if (xbt_automaton_state_compare(pair_test->automaton_state, new_pair->automaton_state) == 0) { if (xbt_automaton_propositional_symbols_compare_value( pair_test->atomic_propositions.get(), new_pair->atomic_propositions.get()) == 0) { - if (this->compare(pair_test, new_pair.get()) == 0) { + if (this->compare(pair_test.get(), new_pair.get()) == 0) { XBT_INFO("Pair %d already reached (equal to pair %d) !", new_pair->num, pair_test->num); liveness_stack.pop_back(); if (dot_output != nullptr) @@ -167,9 +164,8 @@ simgrid::mc::VisitedPair* LivenessChecker::insertAcceptancePair(simgrid::mc::Pai } } - auto new_raw_pair = new_pair.release(); - acceptance_pairs.insert(res.first, new_raw_pair); - return new_raw_pair; + acceptance_pairs.insert(res.first, new_pair); + return new_pair; } void LivenessChecker::removeAcceptancePair(int pair_num) @@ -177,9 +173,6 @@ void LivenessChecker::removeAcceptancePair(int pair_num) for (auto i = acceptance_pairs.begin(); i != acceptance_pairs.end(); ++i) if ((*i)->num == pair_num) { acceptance_pairs.erase(i); - (*i)->acceptance_removed = 1; - if (_sg_mc_visited == 0 || (*i)->visited_removed == 1) - delete *i; break; } } @@ -285,54 +278,49 @@ void LivenessChecker::replay() /** * \brief Checks whether a given pair has already been visited by the algorithm. */ -int LivenessChecker::insertVisitedPair(simgrid::mc::VisitedPair* visited_pair, simgrid::mc::Pair* pair) +int LivenessChecker::insertVisitedPair(std::shared_ptr visited_pair, simgrid::mc::Pair* pair) { if (_sg_mc_visited == 0) return -1; - simgrid::mc::VisitedPair* new_visited_pair = nullptr; if (visited_pair == nullptr) - new_visited_pair = new simgrid::mc::VisitedPair( + visited_pair = std::make_shared( pair->num, pair->automaton_state, pair->atomic_propositions.get(), pair->graph_state); - else - new_visited_pair = visited_pair; auto range = std::equal_range(visited_pairs.begin(), visited_pairs.end(), - new_visited_pair, simgrid::mc::DerefAndCompareByNbProcessesAndUsedHeap()); + visited_pair.get(), simgrid::mc::DerefAndCompareByNbProcessesAndUsedHeap()); for (auto i = range.first; i != range.second; ++i) { - simgrid::mc::VisitedPair* pair_test = *i; - if (xbt_automaton_state_compare(pair_test->automaton_state, new_visited_pair->automaton_state) == 0) { + VisitedPair* pair_test = i->get(); + if (xbt_automaton_state_compare(pair_test->automaton_state, visited_pair->automaton_state) == 0) { if (xbt_automaton_propositional_symbols_compare_value( pair_test->atomic_propositions.get(), - new_visited_pair->atomic_propositions.get()) == 0) { - if (this->compare(pair_test, new_visited_pair) == 0) { + visited_pair->atomic_propositions.get()) == 0) { + if (this->compare(pair_test, visited_pair.get()) == 0) { if (pair_test->other_num == -1) - new_visited_pair->other_num = pair_test->num; + visited_pair->other_num = pair_test->num; else - new_visited_pair->other_num = pair_test->other_num; + visited_pair->other_num = pair_test->other_num; if (dot_output == nullptr) - XBT_DEBUG("Pair %d already visited ! (equal to pair %d)", new_visited_pair->num, pair_test->num); + XBT_DEBUG("Pair %d already visited ! (equal to pair %d)", + visited_pair->num, pair_test->num); else - XBT_DEBUG("Pair %d already visited ! (equal to pair %d (pair %d in dot_output))", new_visited_pair->num, pair_test->num, new_visited_pair->other_num); - *i = new_visited_pair; - pair_test->visited_removed = 1; - if (!pair_test->acceptance_pair - || pair_test->acceptance_removed == 1) - delete pair_test; - return new_visited_pair->other_num; + XBT_DEBUG("Pair %d already visited ! (equal to pair %d (pair %d in dot_output))", + visited_pair->num, pair_test->num, visited_pair->other_num); + (*i) = std::move(visited_pair); + return (*i)->other_num; } } } } - visited_pairs.insert(range.first, new_visited_pair); + visited_pairs.insert(range.first, std::move(visited_pair)); if (visited_pairs.size() > (std::size_t) _sg_mc_visited) { int min2 = mc_stats->expanded_pairs; - std::list::iterator index2; + std::list>::iterator index2; for (auto i = visited_pairs.begin(); i != visited_pairs.end(); ++i) { if ((*i)->num < min2) { index2 = i; @@ -340,11 +328,7 @@ int LivenessChecker::insertVisitedPair(simgrid::mc::VisitedPair* visited_pair, s } } - simgrid::mc::VisitedPair* pair_test = *index2; visited_pairs.erase(index2); - pair_test->visited_removed = 1; - if (!pair_test->acceptance_pair || pair_test->acceptance_removed) - delete pair_test; } return -1; @@ -411,7 +395,7 @@ int LivenessChecker::main(void) xbt_automaton_transition_t transition_succ = nullptr; int cursor = 0; simgrid::xbt::unique_ptr prop_values; - simgrid::mc::VisitedPair* reached_pair = nullptr; + std::shared_ptr reached_pair = nullptr; while (!liveness_stack.empty()){ @@ -577,6 +561,10 @@ int LivenessChecker::run() this->prepare(); int res = this->main(); simgrid::mc::initial_global_state = nullptr; + + acceptance_pairs.clear(); + visited_pairs.clear(); + return res; } diff --git a/src/mc/LivenessChecker.hpp b/src/mc/LivenessChecker.hpp index 6f0cbff564..355e33f13a 100644 --- a/src/mc/LivenessChecker.hpp +++ b/src/mc/LivenessChecker.hpp @@ -11,6 +11,7 @@ #include #include +#include #include #include @@ -55,8 +56,6 @@ struct XBT_PRIVATE VisitedPair { simgrid::xbt::unique_ptr 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, @@ -77,15 +76,15 @@ private: void prepare(); int compare(simgrid::mc::VisitedPair* state1, simgrid::mc::VisitedPair* state2); simgrid::xbt::unique_ptr getPropositionValues(); - simgrid::mc::VisitedPair* insertAcceptancePair(simgrid::mc::Pair* pair); - int insertVisitedPair(simgrid::mc::VisitedPair* visited_pair, simgrid::mc::Pair* pair); + std::shared_ptr insertAcceptancePair(simgrid::mc::Pair* pair); + int insertVisitedPair(std::shared_ptr visited_pair, simgrid::mc::Pair* pair); void showAcceptanceCycle(std::size_t depth); void replay(); void removeAcceptancePair(int pair_num); public: // (non-static wannabe) fields - static std::list acceptance_pairs; + static std::list> acceptance_pairs; static std::list liveness_stack; - static std::list visited_pairs; + static std::list> visited_pairs; }; }