* activities.
*/
class XBT_PUBLIC ActivitySet : public xbt::Extendable<ActivitySet> {
- std::vector<ActivityPtr>
- activities_; // We use a vector instead of a set to improve reproductibility accross architectures
+ std::atomic_int_fast32_t refcount_{1};
+ std::vector<ActivityPtr> activities_; // Use vectors, not sets for better reproductibility accross architectures
std::vector<ActivityPtr> failed_activities_;
+ void handle_failed_activities();
+
public:
ActivitySet() = default;
ActivitySet(const std::vector<ActivityPtr> init) : activities_(init) {}
*/
ActivityPtr wait_any() { return wait_any_for(-1); }
+ /** Return one of the failed activity of the set that was revealed during the previous wait operation, or
+ * ActivityPtr() if no failed activity exist in the set. */
ActivityPtr get_failed_activity();
+ /** Return whether the set contains any failed activity. */
bool has_failed_activities() { return not failed_activities_.empty(); }
+
+ // boost::intrusive_ptr<ActivitySet> 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