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;
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 {
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);
}
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
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
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)
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> {
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)
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