}
bool ActorJoinTransition::depends(const Transition* other) const
{
+ // Actions executed by the same actor are always dependent
+ if (other->aid_ == aid_)
+ return true;
+
// Joining is dependent with any transition whose
// actor is that of the `other` action. , Join i
if (other->aid_ == target_) {
return false;
}
-ActorSleepTransition::ActorSleepTransition(aid_t issuer, int times_considered, std::stringstream& stream)
+bool ActorJoinTransition::reversible_race(const Transition* other) const
+{
+ xbt_assert(type_ == Type::ACTOR_JOIN, "Unexpected transition type %s", to_c_str(type_));
+
+ // ActorJoin races with another event iff its target `T` is the same as the actor executing the other transition.
+ // Clearly, then, we could not join on that actor `T` and then run a transition by `T`, so no race is reversible
+ return false;
+}
+
+ActorSleepTransition::ActorSleepTransition(aid_t issuer, int times_considered, std::stringstream&)
: Transition(Type::ACTOR_SLEEP, issuer, times_considered)
{
XBT_DEBUG("ActorSleepTransition()");
}
bool ActorSleepTransition::depends(const Transition* other) const
{
+ // Actions executed by the same actor are always dependent
+ if (other->aid_ == aid_)
+ return true;
+
// Sleeping is indep with any other transitions: always enabled, not impacted by any transition
return false;
}
+bool ActorSleepTransition::reversible_race(const Transition* other) const
+{
+ xbt_assert(type_ == Type::ACTOR_SLEEP, "Unexpected transition type %s", to_c_str(type_));
+
+ return true; // Always enabled
+}
+
} // namespace simgrid::mc