Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Document ActivitySet
[simgrid.git] / include / simgrid / s4u / ActivitySet.hpp
index 86942a3..10ec7c8 100644 (file)
@@ -23,10 +23,12 @@ namespace s4u {
  * 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) {}
@@ -76,8 +78,24 @@ public:
    */
   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