X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7604d0db48006a7a47120a2de9e7152063d5540c..8052f28d5b5a9d88b6724dff2e5e81dee10065d7:/include/simgrid/s4u/ActivitySet.hpp diff --git a/include/simgrid/s4u/ActivitySet.hpp b/include/simgrid/s4u/ActivitySet.hpp index 86942a3a70..49c79d6fd3 100644 --- a/include/simgrid/s4u/ActivitySet.hpp +++ b/include/simgrid/s4u/ActivitySet.hpp @@ -23,10 +23,12 @@ namespace s4u { * activities. */ class XBT_PUBLIC ActivitySet : public xbt::Extendable { - std::vector - activities_; // We use a vector instead of a set to improve reproductibility accross architectures + std::atomic_int_fast32_t refcount_{1}; + std::vector activities_; // Use vectors, not sets for better reproductibility accross architectures std::vector failed_activities_; + void handle_failed_activities(); + public: ActivitySet() = default; ActivitySet(const std::vector init) : activities_(init) {} @@ -78,6 +80,19 @@ public: ActivityPtr get_failed_activity(); bool has_failed_activities() { return not failed_activities_.empty(); } + + // boost::intrusive_ptr support: + friend void intrusive_ptr_add_ref(ActivitySet* as) + { + XBT_ATTRIB_UNUSED auto previous = as->refcount_.fetch_add(1); + xbt_assert(previous != 0); + } + + friend void intrusive_ptr_release(ActivitySet* as) + { + if (as->refcount_.fetch_sub(1) == 1) + delete as; + } }; } // namespace s4u