Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' into depencencies
authorFrederic Suter <frederic.suter@cc.in2p3.fr>
Thu, 30 Jan 2020 10:06:01 +0000 (11:06 +0100)
committerFrederic Suter <frederic.suter@cc.in2p3.fr>
Thu, 30 Jan 2020 10:06:01 +0000 (11:06 +0100)
1  2 
include/simgrid/s4u/Activity.hpp

@@@ -91,63 -90,11 +94,52 @@@ private
  
  template <class AnyActivity> class Activity_T : public Activity {
  private:
 -  std::string name_             = "";
 +  std::string name_             = "unnamed";
    std::string tracing_category_ = "";
    void* user_data_              = nullptr;
-   std::atomic_int_fast32_t refcount_{0};
 +  std::vector<Activity*> successors_;
 +  std::set<Activity*> dependencies_;
  
  public:
- #ifndef DOXYGEN
-   friend void intrusive_ptr_release(AnyActivity* a)
-   {
-     if (a->refcount_.fetch_sub(1, std::memory_order_release) == 1) {
-       std::atomic_thread_fence(std::memory_order_acquire);
-       delete a;
-     }
-   }
-   friend void intrusive_ptr_add_ref(AnyActivity* a) { a->refcount_.fetch_add(1, std::memory_order_relaxed); }
- #endif
 +
 +  void add_successor(Activity* a)
 +  {
 +    successors_.push_back(a);
 +    static_cast<AnyActivity*>(a)->add_dependency_on(static_cast<Activity*>(this));
 +  }
 +  void remove_successor() { successors_.pop_back(); }
 +  Activity* get_successor() { return successors_.back(); }
 +  bool has_successors() { return not successors_.empty(); }
 +
 +  void add_dependency_on(Activity* a) { dependencies_.insert({a}); }
 +  void remove_dependency_on(Activity* a) { dependencies_.erase(a); }
 +  bool has_dependencies() { return not dependencies_.empty(); }
 +  void release_dependencies()
 +  {
 +    while (has_successors()) {
 +      AnyActivity* b = static_cast<AnyActivity*>(get_successor());
 +      XBT_CDEBUG(s4u_activity, "Remove a dependency from '%s' on '%s'", static_cast<AnyActivity*>(this)->get_cname(),
 +                 b->get_cname());
 +      b->remove_dependency_on(static_cast<Activity*>(this));
 +      if (not b->has_dependencies()) {
 +        b->vetoable_start();
 +      }
 +      remove_successor();
 +    }
 +  }
 +
 +  AnyActivity* vetoable_start()
 +  {
 +    set_state(State::STARTING);
 +    if (has_dependencies())
 +      return static_cast<AnyActivity*>(this);
 +    set_state(State::STARTED);
 +    XBT_CDEBUG(s4u_activity, "All dependencies are solved, let's start '%s'",
 +               static_cast<AnyActivity*>(this)->get_cname());
 +    static_cast<AnyActivity*>(this)->start();
 +    return static_cast<AnyActivity*>(this);
 +  }
 +
    AnyActivity* set_name(const std::string& name)
    {
      xbt_assert(get_state() == State::INITED, "Cannot change the name of an activity after its start");