Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
take two on prepare() for Waitany and Testany observers
authorSUTER Frederic <frederic.suter@cc.in2p3.fr>
Wed, 2 Feb 2022 11:16:04 +0000 (12:16 +0100)
committerSUTER Frederic <frederic.suter@cc.in2p3.fr>
Wed, 2 Feb 2022 11:16:04 +0000 (12:16 +0100)
src/kernel/activity/ActivityImpl.cpp
src/kernel/activity/CommImpl.cpp
src/kernel/actor/SimcallObserver.cpp
src/kernel/actor/SimcallObserver.hpp

index c95beb4..5618538 100644 (file)
@@ -85,16 +85,17 @@ bool ActivityImpl::test(actor::ActorImpl* issuer)
 
 ssize_t ActivityImpl::test_any(actor::ActorImpl* issuer, const std::vector<ActivityImpl*>& activities)
 {
+  auto* observer = dynamic_cast<kernel::actor::ActivityTestanySimcall*>(issuer->simcall_.observer_);
+  xbt_assert(observer != nullptr);
+
   if (MC_is_active() || MC_record_replay_is_active()) {
-    int idx = issuer->simcall_.mc_value_;
+    int idx = observer->get_value();
     xbt_assert(idx == -1 || activities[idx]->test(issuer));
     return idx;
   }
 
   for (std::size_t i = 0; i < activities.size(); ++i) {
     if (activities[i]->test(issuer)) {
-      auto* observer = dynamic_cast<kernel::actor::ActivityTestanySimcall*>(issuer->simcall_.observer_);
-      xbt_assert(observer != nullptr);
       observer->set_result(i);
       issuer->simcall_answer();
       return i;
@@ -147,6 +148,19 @@ void ActivityImpl::wait_for(actor::ActorImpl* issuer, double timeout)
 void ActivityImpl::wait_any_for(actor::ActorImpl* issuer, const std::vector<ActivityImpl*>& activities, double timeout)
 {
   XBT_DEBUG("Wait for execution of any synchro");
+  if (MC_is_active() || MC_record_replay_is_active()) {
+    auto* observer = dynamic_cast<kernel::actor::ActivityWaitanySimcall*>(issuer->simcall_.observer_);
+    xbt_assert(observer != nullptr);
+    xbt_assert(timeout <= 0.0, "Timeout not implemented for waitany in the model-checker");
+    int idx   = observer->get_value();
+    auto* act = activities[idx];
+    act->simcalls_.push_back(&issuer->simcall_);
+    observer->set_result(idx);
+    act->set_state(State::DONE);
+    act->finish();
+    return;
+  }
+
   if (timeout < 0.0) {
     issuer->simcall_.timeout_cb_ = nullptr;
   } else {
index 53537a5..4af2569 100644 (file)
@@ -419,16 +419,6 @@ void CommImpl::wait_for(actor::ActorImpl* issuer, double timeout)
 
 void CommImpl::wait_any_for(actor::ActorImpl* issuer, const std::vector<CommImpl*>& comms, double timeout)
 {
-  if (MC_is_active() || MC_record_replay_is_active()) {
-    xbt_assert(timeout <= 0.0, "Timeout not implemented for waitany in the model-checker");
-    int idx    = issuer->simcall_.mc_value_;
-    auto* comm = comms[idx];
-    comm->simcalls_.push_back(&issuer->simcall_);
-    simcall_comm_waitany__set__result(&issuer->simcall_, idx);
-    comm->set_state(State::DONE);
-    comm->finish();
-    return;
-  }
   std::vector<ActivityImpl*> activities(comms.begin(), comms.end());
   ActivityImpl::wait_any_for(issuer, activities, timeout);
 }
index c6b0c69..76de9ec 100644 (file)
@@ -169,7 +169,7 @@ int ActivityTestanySimcall::get_max_consider() const
 
 void ActivityTestanySimcall::prepare(int times_considered)
 {
-  next_activity_ = activities_[times_considered];
+  next_value_ = times_considered + 1;
 }
 
 std::string ActivityTestanySimcall::to_string(int times_considered) const
@@ -318,7 +318,7 @@ int ActivityWaitanySimcall::get_max_consider() const
 
 void ActivityWaitanySimcall::prepare(int times_considered)
 {
-  next_activity_ = activities_[times_considered];
+  next_value_ = times_considered + 1;
 }
 
 std::string ActivityWaitanySimcall::to_string(int times_considered) const
index 988075f..54d6fa8 100644 (file)
@@ -184,7 +184,7 @@ public:
 
 class ActivityTestanySimcall : public ResultingSimcall<ssize_t> {
   const std::vector<activity::ActivityImpl*>& activities_;
-  activity::ActivityImpl* next_activity_;
+  int next_value_ = -1;
 
 public:
   ActivityTestanySimcall(ActorImpl* actor, const std::vector<activity::ActivityImpl*>& activities)
@@ -198,7 +198,7 @@ public:
   std::string to_string(int times_considered) const override;
   std::string dot_label(int times_considered) const override;
   const std::vector<activity::ActivityImpl*>& get_activities() const { return activities_; }
-  activity::ActivityImpl* get_next_activity() const { return next_activity_; }
+  int get_value() const { return next_value_; }
 };
 
 class ActivityWaitSimcall : public ResultingSimcall<bool> {
@@ -222,8 +222,8 @@ public:
 
 class ActivityWaitanySimcall : public ResultingSimcall<ssize_t> {
   const std::vector<activity::ActivityImpl*>& activities_;
-  activity::ActivityImpl* next_activity_;
   const double timeout_;
+  int next_value_ = -1;
 
 public:
   ActivityWaitanySimcall(ActorImpl* actor, const std::vector<activity::ActivityImpl*>& activities, double timeout)
@@ -239,7 +239,7 @@ public:
   std::string dot_label(int times_considered) const override;
   const std::vector<activity::ActivityImpl*>& get_activities() const { return activities_; }
   double get_timeout() const { return timeout_; }
-  activity::ActivityImpl* get_next_activity() const { return next_activity_; }
+  int get_value() const { return next_value_; }
 };
 
 } // namespace actor